强制 Cocoa 在单击按钮时更新绑定值

问题描述 投票:0回答:1

默认情况下,Cocoa 将

NSTextFiled
的值绑定到属性仅在文本字段失去输入焦点时才会更新模型。

有没有办法强制更新,例如单击表单按钮而不使用“连续更新值”?

我尝试过什么。

我已经创建了带有 XIB 接口的 Xcode macOS Objective-C 项目。

我已经按以下方式布置了主菜单的表单:

Form layout

我已向项目添加了以下类:

@interface Person : NSObject
@property (weak) NSString* firstName;
@property (weak) NSString* middleName;
@property (weak) NSString* lastName;
@end

并修改了我的AppDelegeate:

@interface AppDelegate : NSObject <NSApplicationDelegate>
@property (strong) Person* person;
@end

最后,我将表单

NSTextFiled
绑定到
AppDelegate
person
的属性,如下所示:

Binding

并将保存按钮操作连接到以下方法:

- (IBAction)onSave:(id)sender {
    NSLog(@"%@ %@ %@", self.person.firstName, self.person.middleName, self.person.lastName);
}

现在,当我运行应用程序时

  1. 在第一个文本字段中输入“John”,单击第二个;
  2. 在第二个文本字段中输入“Lee”,单击第三个;
  3. 在第三个文本字段中输入“Hooker”然后单击“保存”按钮

,我进入日志了

John Lee (null)

这显然意味着,默认情况下,仅当文本字段失去输入焦点时才会更新绑定值。

那么,有没有办法强制 Cocoa 在单击按钮时更新所有表单的绑定值?

“连续更新值”选项很厚,但我将避免在每次敲击键盘时更新模型。

objective-c xcode macos cocoa cocoa-bindings
1个回答
0
投票

最简单的方法是确保文本字段放弃第一响应者状态,这意味着结束编辑。示例:

 - (IBAction)onSave:(id)sender {
    [sender.window makeFirstResponder:sender.window]; // <-- this!
    NSLog(@"%@ %@ %@", self.person.firstName, self.person.middleName, self.person.lastName);
}
© www.soinside.com 2019 - 2024. All rights reserved.