Cocoa中的setString与setStringValue

时间:2010-07-07 20:43:43

标签: cocoa

我尝试使用方法setString来更改文本字段中的文本,但它不起作用。然后我将其更改为setStringValue并且它有效。那么setString用于什么?

3 个答案:

答案 0 :(得分:7)

NSTextField没有setString:方法。 NSTextField是一种NSControlNSControl采用setStringValue:方法。

NSText及其更着名的子类NSTextView具有setString:方法。 @John Boker说明字段编辑器是NSText是正确的,但即使在编辑模式下,您仍然无法将setString:发送到NSTextField。您需要从窗口中获取字段编辑器,然后在其上调用setString:(不是您真的应该这样做)。

虽然对新手来说很困惑,但不同方法背后有一个很好的理由。 NSControl有一个“值”,该值可以采用不同的类型(setDoubleValue:setObjectValue:等。)这允许我将值设置为double,但然后将其作为一个字符串。对于广泛的可能控制,这很有意义,而且非常灵活。 NSText不是控件;请注意它没有setAction:setTarget:。其目的是显示和编辑(归因)字符串。当您致电string时,您实际上正在获得真实的支持文本存储,而不仅仅是字符串形式的对象值(stringValueNSControl执行)。

那就是说,当你说“它不起作用”时,我希望你的意思是你有一个编译器警告,告诉你NSTextField可能不会回复setString:。如果你忽略了编译器警告,那么你将在ObjC中遇到很多问题。

答案 1 :(得分:2)

来自:http://macosx.com/forums/software-programming-web-scripting/43905-_outlet-setstring-testing-selector-not-recognized.html#5

  

setString:用于NSText,即   用于NSTextField字段的类   正在编辑的编辑器,和   对于NSText子类NSTextView   它可以显示和编辑样式文本   在TextEdit中。

所以我采取的方式是你只能使用setString:当字段处于编辑模式时,我认为。

答案 2 :(得分:1)

更一般地说(与我对Rob的回答的评论相反):

对象响应消息。您可以向响应该消息的任何对象发送消息;您无法向任何不响应它的对象发送消息。

NSText及其子类NSTextView的实例响应setString:,因此您可以发送NSText对象和NSTextView对象setString:消息。

NSControl实例及其子类(包括NSTextField)响应setStringValue:,因此您可以发送NSControl对象,NSTextField对象和其他控件对象setStringValue:消息。

请参阅Rob的回答以及我对为什么这些类层次结构的这两个特定分支具有这些看似相似但命名不同的方法的评论。