【问题标题】:NSCFString or UIViewController?NSCFString 还是 UIViewController?
【发布时间】:2010-08-05 13:48:30
【问题描述】:

我正在使用带有文本字段的 UIViewController(当然是子类),该文本字段在内容更改时发送一个动作(到 contentsChanged:ViewController 的选择器)。它是通过向 IB 中的文件所有者发送 contentsChanged: 来完成的。 但是当我测试它时,它说:“-[NSCFString contentsChanged:]:无法识别的选择器发送到实例”和十六进制的实例指针。 我猜测由于某种原因,视图控制器被移动到另一个指针并在那里分配了一个字符串,但我不知道为什么。 有什么想法吗?

【问题讨论】:

    标签: objective-c cocoa-touch uiviewcontroller nsstring uitextfield


    【解决方案1】:

    听起来像一个经典案例。阅读 NSZombieEnabled 了解如何追踪此类问题。

    【讨论】:

    【解决方案2】:

    我对 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 的问题相似,但为了共享信息,我暂时不会删除它。当我开始制作示例项目以提交错误报告时,我经常解决我的问题。是的,单击使 answerButton 调用 getAnswerToQuestion: 就像一个很好的小对象,一切都很好。

    示例项目的子类 UIViewController 和我的实际项目的区别在于,第一个也充当 xib 的文件所有者,而第二个只是几个视图控制器之一。当我将 getAnswerToQuestion: 移到我真实项目中的文件所有者时,单击 answerButton 按预期工作。因此,我认为问题出在从 binding 到 performSelector 的转换中的预感并没有那么遥远:问题在于响应者链。我认为以编程方式或在 IB 中建立 Action-Target 链接会绕过响应者链,但显然不是。

    当然,现在的问题是 Alexandre 在他的问题中指出他的 contentsChanged: 方法已经是文件所有者的一部分,这使得我的回答与问题无关。

    【讨论】:

    • 谢谢,我要升级到 4.0.1 看看它是否有效。如果您在我之前这样做,请让我在这里发布,告诉我它是否有效。
    • 我刚刚升级了,很抱歉告诉你它没有用。根据文档,我将 (IBAction) 替换为 (void) ,这是正确的 iOS 形式。我最新的崩溃报告:iPhone Simulator 4.0 (211.1)、iPhone OS 4.0.1 (iPhone/8A306) *** 由于未捕获的异常 'NSInvalidArgumentException' 导致应用程序终止,原因:'-[NSCFString getAnswerToQuestion:]:无法识别的选择器已发送到实例0x711fec0'。我可以确认“实例 0x711fec0”是 addTarget 中指定的自我,即子类视图控制器。
    【解决方案3】:

    不看代码,看起来您是在文本字段的文本上调用 contentsChanged:,而不是 UIViewController 子类。

    【讨论】:

    • 不,我可以告诉你我给它一个目标的代码:[inputTextField addTarget:self action:@selector(contentsChanged:) forControlEvents:UIControlEventEditingChanged];它没有理由调用文本!
    【解决方案4】:

    您应该考虑使用 UITextFieldDelegate 协议在 UITextField 的文本更改时被回调。我没看过,但这是我会做的事。

    【讨论】:

      猜你喜欢
      • 2012-01-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多