我正在使用UIViewController(当然是一个子类),文本字段在内容发生变化时发送动作(发送到ViewController的contentsChanged:selector)。这是通过将contentChanged:发送到IB中的文件所有者来完成的。 但是当我测试它时,它会说:“ - [NSCFString contentsChanged:]:发送到实例的无法识别的选择器”和十六进制的实例指针。 我猜测由于某种原因,视图控制器被移动到另一个指针并且字符串在那里被分配,但我无法理解为什么。 有什么想法吗?
答案 0 :(得分:3)
听起来像是经典案例。阅读NSZombieEnabled,了解如何追踪这类问题。
答案 1 :(得分:1)
我对UIViewController的子类和这段无害的代码有完全相同的问题:
- (void)viewDidLoad
{
NSLog(@"%@ %s %@", [self class], _cmd, answerButton);
[self.answerButton addTarget:self
action:@selector(getAnswerToQuestion:)
forControlEvents:UIControlEventTouchUpInside];
}
是的,answerButton是连接的(它是一个IBOutlet),是的,- (IBAction)getAnswerToQuestion:(id)sender;
是一个正确的方法,但没有快乐。当我注释掉viewDidLoad并在IB中建立连接时,它在崩溃报告中显示失败发生在[UIControl sendAction:to:forEvent:]导致
objc_msgSend()选择器名称:performSelector:withObject:withObject:
我无法证明这一点,但我怀疑UIKit中的某个地方存在一个错误,它将绑定和addTarget转换为对performSelector的调用。我打算先升级到iOS 4.01,看看是否能解决问题。
更新: 我不确定我的问题是否真的与Alexandre Cassagne相似,但为了分享信息,我不会删除它。当我开始制作示例项目以提交错误报告时,我经常解决我的问题。是的,点击make answerButton调用getAnswerToQuestion:就像一个好的小对象,一切都很好。
示例项目的子类UIViewController与我的真实项目之间的区别在于,第一个也用作xib的文件所有者,而第二个只是几个视图控制器中的一个。当我将getAnswerToQuestion:移动到我的真实项目中的文件所有者时,单击answerButton按预期工作。因此,我的预感是问题在于从绑定到performSelector的转换中的某个地方并不是那么遥远:问题在于响应者链。我认为以编程方式或在IB中建立Action-Target链接会绕过响应者链,但显然不会。
现在的问题当然是,亚历山大在他的问题中说他的内容改变:方法已经是文件所有者的一部分,这使我的答案与问题无关。
答案 2 :(得分:0)
不看代码,看起来你在文本字段的文本上调用contentsChanged:而不是UIViewController子类。
答案 3 :(得分:0)
当UITextField的文本发生变化时,您应该考虑使用UITextFieldDelegate协议来回调。我没有看过,但这是我想做的事情。