【问题标题】:NSTextField delegate notifications -- how to get text?NSTextField 委托通知——如何获取文本?
【发布时间】:2011-05-11 19:03:04
【问题描述】:

我一直在尝试学习使用 Xcode,但我对如何注册 NSTextField 已更改感到困惑。本质上,我有一个NSTextField 和一个按钮。单击该按钮会处理字段中的文本。但是,我希望能够在不需要使用文本字段“操作:结束编辑时发送”的情况下获取该字段的文本。也就是说,我希望能够输入文本并立即按下按钮,而无需按 Enter 键或跳出文本框。似乎这样做的方法是为我的NSTextField 设置一个代表来响应

- (void)controlTextDidChange:(NSNotification *)aNotification

但我不明白如何获取已输入的文本。我认为这与它有关

[[aNotification userInfo] valueForKey:@"NSFieldEditor"];

但我真的不知道从那里去哪里。

【问题讨论】:

    标签: objective-c cocoa delegates notifications nstextfield


    【解决方案1】:

    你在正确的轨道上!您从通知的用户信息字典中得到的对象是Field Editor,它只是一个代表文本字段处理文本输入的NSTextView

    一旦你有了那个对象,你所要做的就是向它询问它的textStorage,它是一个包含文本的NSTextStorage* 对象。反过来,该对象有其 string,它是一个普通的旧 NSString,仅包含字符。

    NSTextView * fieldEditor = [[aNotification userInfo] objectForKey:@"NSFieldEditor"];
    NSString * theString = [[fieldEditor textStorage] string];
    

    *NSAttributedString 的子类,它是一个包含字符串和相关“属性”(如颜色、字体和下划线)的对象。

    【讨论】:

    • 我可以建议-objectForKey: 而不是-valueForKey: 吗?前者是从字典中获取值的规范方法。
    • @Bavarious:你是对的!在没有仔细阅读的情况下复制粘贴了 OP 的代码行是有罪的。
    【解决方案2】:

    在您的按钮操作方法中,只需读取文本字段中的当前字符串值:

    - (IBAction)didClickTheButton:(id)sender {
    
        NSString* theString = [myTextField stringValue];
    
        // do something with theString
    
    }
    

    【讨论】:

    • 哇,这容易多了。为什么另一个看起来如此复杂的答案目前的评分更高?
    • @SilverSideDown 至少当我问这个问题时,这不会注册在没有用户跳出或回车的情况下输入的文本。
    • 如果您使用数据绑定,您可以设置“持续更新值”选项,这将在您键入时更新绑定值,而无需按回车键或制表符。调用 -stringValue 方法将返回 NSTextField 中的当前文本。
    • Darren 的答案是最好的,实际上不需要编码 - 除了声明一个 ivar。在 2016 年与 Swift 一起工作没有问题! ;) 谢谢,伙计!
    【解决方案3】:

    如果您只处理一个文本字段,这可能会更简单:

    - (void)controlTextDidChange:(NSNotification *)obj {
        [self.inputField stringValue];
    }
    

    我完全忽略了 NSText 和诸如此类的所有复杂细节,只使用发送通知的简单性和从文本字段获取字符串值的简单性。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-06-18
      • 1970-01-01
      • 2019-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多