Objective c NSCFString还是UIViewController?
我使用的UIViewController(当然是一个子类)带有一个文本字段,当内容发生更改时,该字段会发送一个操作(到ViewController的ContentsAnged:selector)。它是通过将contentsChanged:发送到IB中的文件所有者来完成的。 但当我测试它时,它会说:“-[NSCFString contentsChanged:]:未识别的选择器发送到实例”,实例指针是十六进制的。 我猜想,由于某种原因,视图控制器被移动到另一个指针,并且在那里分配了一个字符串,但我不明白为什么。Objective c NSCFString还是UIViewController?,objective-c,cocoa-touch,uiviewcontroller,nsstring,uitextfield,Objective C,Cocoa Touch,Uiviewcontroller,Nsstring,Uitextfield,我使用的UIViewController(当然是一个子类)带有一个文本字段,当内容发生更改时,该字段会发送一个操作(到ViewController的ContentsAnged:selector)。它是通过将contentsChanged:发送到IB中的文件所有者来完成的。 但当我测试它时,它会说:“-[NSCFString contentsChanged:]:未识别的选择器发送到实例”,实例指针是十六进制的。 我猜想,由于某种原因,视图控制器被移动到另一个指针,并且在那里分配了一个字符串,但我不
有什么想法吗?如果不看代码,看起来您是在文本字段的文本上调用contentsChanged:而不是UIViewController子类。如果不看代码,看起来您是在文本字段的文本上调用contentsChanged:,而不是UIViewController子类。我对UIViewController子类和这段无害代码有完全相同的问题:
- (void)viewDidLoad
{
NSLog(@"%@ %s %@", [self class], _cmd, answerButton);
[self.answerButton addTarget:self
action:@selector(getAnswerToQuestion:)
forControlEvents:UIControlEventTouchUpInside];
}
是,应答按钮已连接(它是一个IBOutlet),是,-(iAction)getAnswerToQuestion:(id)发送方
是一种合适的方法,但没有乐趣。当我注释掉viewDidLoad并在IB中建立连接时,它在崩溃报告中显示失败发生在[UIControl sendAction:to:forEvent:]上,导致
objc_msgSend()选择器名称:性能选择器:withObject:withObject:
我无法证明这一点,但我怀疑UIKit中的某个地方存在一个bug,它将绑定和addTarget转换为对performSelector的调用。我计划先升级到iOS 4.01,看看这能否解决问题
更新:
我不确定我的问题是否真的与Alexandre Cassagne的问题相似,但为了分享信息,我现在还不会删除它。当我开始制作一个示例项目以提交一个bug报告时,我解决了我的问题。是的,点击madeanswerbutton调用getAnswerToQuestion:就像一个好的小物体,一切都很好
示例项目的子类UIViewController与实际项目的UIViewController之间的区别在于,第一个类还充当xib文件的所有者,而第二个类只是几个视图控制器中的一个。当我将getAnswerToQuestion:移动到实际项目中的文件所有者时,单击answerButton按预期工作。因此,我的直觉是,从绑定到performSelector的翻译过程中的某个地方存在问题,这一点并不遥远:问题在于响应者链。我认为以编程方式或在IB中建立操作目标链接将绕过响应者链,但显然不是这样
当然,现在的问题是Alexandre在他的问题中指出,他的contentsAnged:method已经是文件所有者的一部分,这使得我的回答与问题无关。我对UIViewController的子类和这段无害的代码有着完全相同的问题:
- (void)viewDidLoad
{
NSLog(@"%@ %s %@", [self class], _cmd, answerButton);
[self.answerButton addTarget:self
action:@selector(getAnswerToQuestion:)
forControlEvents:UIControlEventTouchUpInside];
}
是,应答按钮已连接(它是一个IBOutlet),是,-(iAction)getAnswerToQuestion:(id)发送方
是一种合适的方法,但没有乐趣。当我注释掉viewDidLoad并在IB中建立连接时,它在崩溃报告中显示失败发生在[UIControl sendAction:to:forEvent:]上,导致
objc_msgSend()选择器名称:性能选择器:withObject:withObject:
我无法证明这一点,但我怀疑UIKit中的某个地方存在一个bug,它将绑定和addTarget转换为对performSelector的调用。我计划先升级到iOS 4.01,看看这能否解决问题
更新:
我不确定我的问题是否真的与Alexandre Cassagne的问题相似,但为了分享信息,我现在还不会删除它。当我开始制作一个示例项目以提交一个bug报告时,我解决了我的问题。是的,点击madeanswerbutton调用getAnswerToQuestion:就像一个好的小物体,一切都很好
示例项目的子类UIViewController与实际项目的UIViewController之间的区别在于,第一个类还充当xib文件的所有者,而第二个类只是几个视图控制器中的一个。当我将getAnswerToQuestion:移动到实际项目中的文件所有者时,单击answerButton按预期工作。因此,我的直觉是,从绑定到performSelector的翻译过程中的某个地方存在问题,这一点并不遥远:问题在于响应者链。我认为以编程方式或在IB中建立操作目标链接将绕过响应者链,但显然不是这样
当然,现在的问题是,Alexandre在他的问题中指出,他的contentsChanged:method已经是文件所有者的一部分,这使得我的回答与这个问题无关。听起来像是一个经典案例。阅读NSZombieEnabled,了解如何追踪此类问题。听起来像是一个经典案例。在NSZOMPEBEnter上读取如何跟踪这类问题。< P>您应该考虑使用UITExtFieldAt委托协议在UITExtField字段的文本发生更改时调用。我没有看过,但这是我要做的事。 你应该考虑使用uITExtFieldAt委托协议在UITExtField字段的文本发生更改时调用。我还没有看过,但这是我想马上做的事情。不,我可以向您展示我给它一个目标的代码:[InputExtField addTarget:self action:@selector(contentsChanged:)forControlEvents:UIControlEventEditingChanged];它没有理由调用文本!不,我可以向您展示我给它一个目标的代码:[InputExtField addTarget:self action:@selector(contentsChanged:)forControlEvents:UIControlEventEditingChanged];它没有理由调用文本!谢谢,我要升级到4.0.1,看看能不能用。如果你在我之前做过,请让我在这里发布消息,告诉我它是否有效。我刚刚升级,很抱歉告诉你我失败了