objective-c – 使用绑定和格式化程序来驯服NSTextField以使其正常运行

objective-c – 使用绑定和格式化程序来驯服NSTextField以使其正常运行,第1张

概述我想要一个需要接受一些用户输入的窗口,为此我有以下内容: > NSWindow从带有NSWindowController的笔尖加载,这也是它的代表 > NSTextField的几个与NSNumberFormatter >使用绑定,NSTextField绑定到NSWindowController中的整数属性(为简单起见,我没有使用NSObjectController,但如果需要可以添加它) >完成后 我想要一个需要接受一些用户输入的窗口,为此我有以下内容:

> NSWindow从带有NSWindowController的笔尖加载,这也是它的代表
> NSTextFIEld的几个与NSNumberFormatter
>使用绑定,NSTextFIEld绑定到NSWindowController中的整数属性(为简单起见,我没有使用NSObjectController,但如果需要可以添加它)
>完成后用户单击以接受更改并关闭窗口的“完成”NSbutton
>在控制器的windowshouldClose:方法做最后的验证,并决定是否可以关闭窗口

我想要实现的是非常简单的,但Cocoa坚持要做到这一点具有挑战性:

> NSTextFIEld应仅接受最终值的数字,该数字也大于零
>如果用户尝试插入非数字值或零,则应该有提示用户修复其输入的警报
>当用户点击完成时:

>做其他自定义验证(例如比较一个数字是否比另一个更好)
>如果值正确,接受更改并关闭窗口(‘model’应该已经通过绑定更新了值)
>如果值不正确,应提示用户选择是否修复条目(保持窗口打开)或关闭窗口并放弃更改

很简单. NSNumberFormatter应该已经涵盖了大部分任务,并且与绑定一起,这应该很容易实现.

问题#1:

当NSTextFIEld失去焦点并且值不正确时,我无法找到更改警报中向用户显示的错误消息的方法.有没有办法做到这一点?或者我需要以某种方式实现我自己的NSFormatter?

问题#2:

当用户更改NSTextFIEld中的值并单击“完成”按钮时,Cocoa不会将此视为更新NSTextFIEld绑定的模型值的触发器.这可能是标准的OSX行为,但是没有任何意义.

我能够通过在’done’按钮的 *** 作中调用[window makeFirstResponder:nil]来强制NSTextFIEld失去焦点并更新值,但我想知道这是否是实现此目的的正确方法.

问题#3:

而这里是我真正挠头的地方.如果用户在NSTextFIEld中输入了不正确的值(如非整数)并单击“完成”按钮,则验证不会启动,并且NSTextFIEld将在模型未更新时继续具有不正确的值.

我希望仍会显示“无效”警报,我有一些地方可以插入代码来决定是否关闭窗口,但我找不到任何方法来覆盖此行为.

实现这些要求的标准做法应该是什么?我是否应该放弃格式化程序和/或绑定,并使用 *** 作手动完成所有 *** 作?

解决方法 对于问题1,尝试为文本字段设置委托并实现-control:dIDFailToFormatString:errorDescription:和可能的-control:dIDFailTovalIDatePartialString:errorDescription:.提供您想要的任何UI,或者使用错误描述.

或者,您可以实现NSNumberFormatter的自定义子类并覆盖-getobjectValue:forString:errorDescription:和-isPartialStringValID:proposedSelectedRange:originalString:originalSelectedRange:errorDescription:.您可以通过super调用大部分实现.如果失败,您可以替换超级提供的错误描述.如果需要formatter对象的上下文(其属性等)来确定更好的错误描述,则可以使用此方法.

问题2的正确解决方案是不以编程方式更改第一响应者.相反,您确实应该使用NSObjectController在文本字段和窗口控制器之间进行调解.在“完成”按钮的 *** 作方法中,调用-commitEditing或-commitEditingWithDelegate:dIDCommitSelector:contextInfo:. NSObjectController从NSController继承这些方法,NSController采用NSEditor协议.当您获得结果(同步为前者,后者为异步)时,您可以继续执行或不执行任何 *** 作,具体取决于提交是成功还是失败.

我怀疑问题3也是以编程方式更改窗口的第一响应者的结果.通常情况下,程序化更改不会受到与用户 *** 作所做的相应更改相同的检查.框架假设您,程序员知道您正在做什么,因此将格式化程序的程序化更改置于格式化程序验证之前是“错误的”.

总结

以上是内存溢出为你收集整理的objective-c – 使用绑定和格式化程序来驯服NSTextField以使其正常运行全部内容,希望文章能够帮你解决objective-c – 使用绑定和格式化程序来驯服NSTextField以使其正常运行所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1072183.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-26
下一篇 2022-05-26

发表评论

登录后才能评论

评论列表(0条)

保存