UITextFieldDelegate 导致异常

Posted

技术标签:

【中文标题】UITextFieldDelegate 导致异常【英文标题】:UITextFieldDelegate Causes Exception 【发布时间】:2013-01-06 11:32:36 【问题描述】:

简单案例。我想创建一个 UIViewController 来显示和响应一个简单的 UITextField 的输入。

    我创建了一个包含 xib 文件的 UIViewController。 在 Interface Builder 中,我添加了一个 View 和一个包含 UITextField文件的所有者 设置为包含逻辑“CardViewController”的相应类名。 文件所有者指向视图作为视图。 文本字段使用文件的所有者作为委托

看起来像这样……

视图正在正确显示,但只要我点击文本字段,应用程序就会崩溃并出现异常“EXC_BAD_ACCESS....”

我的猜测是委托的分配有问题,但我在查找问题时遇到了问题。任何的想法?我错过了什么?


进一步的发现。当我直接在 AppDelegate 中实例化此视图控制器时,UITextField 的委托实际上有效!

但我实际上打算先创建一个“BoardViewController”类的实例,然后再创建“CardViewController”对象。这种嵌套会导致委托失败。

作为参考。在我的 App Delegate 中:

BoardViewController *bvc = [[BoardViewController alloc] init];
[self.window setRootViewController:bvc];

在 Board 类中,我有一个“添加”按钮,用于触发 CardViewControllers 的创建

-(void) addCard:(id)touchEvent
    NSLog(@"<Board> Add");
    CardViewController *cvc = [[CardViewController alloc]init];
    [self.view addSubview:cvc.view];

然后 CardViewController 看起来就像最初提到的那样,委托在 xib 中设置。

【问题讨论】:

是的。真的。谢谢。我在测试后忘记更改它以直接在 AppDelegate 中实例化 CardViewController。我更正了。 【参考方案1】:

看起来您的 CardViewController 没有初始化。你建议它应该建在哪里?

【讨论】:

但它是通过“CardViewController *cvc = [[CardViewController alloc]init]; [self.view addSubview:cvc.view];”从另一个类初始化的它正在显示。只有当我点击文本字段时,应用才会崩溃。 它应该通过initWithNibName构造,因为它存储在nib中。 我认为 init 应该以相同的名称自动获取正确的 nib/xib。无论如何,我尝试了“CardViewController *cvc = [[CardViewController alloc]initWithNibName:@"CardViewController" bundle:nil]”。不幸的是,它仍然在崩溃。 您是否为 UITextViewDelegate 协议实现了任何代码?为您的文本字段添加出口,在控制器创建上放置断点,并检查此 cvc.textField.delegate 之后是否指向 cvc。 我还没有实现任何委托方法。它们都是可选的。问题发生在委托被调用时,而不是在分配时。代表的分配一定是错误的。我还不确定是否需要在代码和 xib 中分配它,或者它是否不足以链接 xib 文件中的委托。【参考方案2】:

看来我找到了解决方案。除了将 CardViewController 的视图添加为子视图之外,我还需要将其添加为 ChildViewController。

在父 BoardViewController 中

-(void) addCard:(id)touchEvent
    CardViewController *cvc = [[CardViewController alloc]init];
    [self addChildViewController:cvc];
    [self.view addSubview:cvc.view];

然后委托调用工作。耶。

【讨论】:

【参考方案3】:

您需要正确初始化您的视图控制器。

CardViewController *objCardView = [[CardViewController alloc]initWithNibName:@"CardViewController" bundle:nil];

[self.view addSubview:objCardView.view];

如果这是正常的,那么检查这个东西:

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil

    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) 
        // Custom initialization

    
    return self;

你的类的这个方法正在工作,然后检查 ViewDidLoad。

然后你还需要检查你是否正确地实现了你的 textField Delegate。使用属性初始化您的 textField 并建立连接文件所有者。

使用断点调试您的代码。我希望这会对你有所帮助。

【讨论】:

以上是关于UITextFieldDelegate 导致异常的主要内容,如果未能解决你的问题,请参考以下文章

swift 3.0 - UITextFieldDelegate 协议扩展不起作用

安装macOS时遇到Unable to unmount volume for repair异常导致无法完成安装的解决办法

我正在寻找 UITextFieldDelegate 示例代码 [关闭]

ViewController 实现 UITextFieldDelegate 时出错

UITextFieldDelegate:如何选择为每个单独的 TextField 调用哪些方法

UITextFieldDelegate 崩溃 (exc_bad_access)