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

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

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

看起来像这样……

视图正在正确显示,但只要我点击文本字段,应用程序就会崩溃并出现异常“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。我更正了。

标签: objective-c ios delegates uitextfield uitextfielddelegate


【解决方案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 并建立连接文件所有者。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-03-23
      • 2011-06-08
      • 2017-02-16
      • 2018-11-09
      • 2014-03-13
      • 2011-09-06
      • 2010-11-20
      相关资源
      最近更新 更多