如何在点击按钮时强制Cocoa更新绑定值(禁用持续更新)
如何在点击按钮时强制更新Cocoa绑定的NSTextField值到模型(无需持续更新)
默认情况下,Cocoa的NSTextField在绑定到模型属性时,仅会在失去输入焦点时将值同步到模型。要实现点击保存按钮时强制更新所有绑定值,同时避免逐键更新模型,可通过以下方式解决:
核心解决方案
在保存按钮的动作方法中,先让窗口结束所有编辑状态,触发绑定控件的值同步,再读取模型数据。
修改你的onSave:方法如下:
- (IBAction)onSave:(id)sender { // 强制窗口内所有编辑控件提交值到绑定模型 [sender.window endEditingFor:nil]; NSLog(@"%@ %@ %@", self.person.firstName, self.person.middleName, self.person.lastName); }
方法说明
endEditingFor:方法会通知窗口中所有处于编辑状态的控件结束编辑流程,这会触发NSTextField将当前输入值同步到绑定的模型属性,完全符合需求——既不用开启「Continuously Update Value」选项,也能在点击保存时一次性更新所有值。
修复代码中的潜在问题
你当前的Person类中,NSString属性使用了weak修饰符,这会导致字符串对象在没有强引用时被自动释放,可能出现日志中的(null)情况。请将属性改为strong:
@interface Person : NSObject @property (strong) NSString* firstName; @property (strong) NSString* middleName; @property (strong) NSString* lastName; @end
可选替代方法
如果上述方法不适用,也可以通过让窗口的第一响应者(当前编辑的文本框)放弃焦点来触发更新:
- (IBAction)onSave:(id)sender { [[NSApp mainWindow] makeFirstResponder:nil]; NSLog(@"%@ %@ %@", self.person.firstName, self.person.middleName, self.person.lastName); }
内容的提问来源于stack exchange,提问作者eggor
相关产品推荐
相关产品推荐

