UITextFieldDelegate导致异常

问题描述:

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

  1. 我创建了一个UIViewController,其中包括xib文件。
  2. 在界面生成器中,我添加了一个视图和一个包含UITextField
  3. 文件的所有者设置为包含逻辑“CardViewController”的相应类名称。
  4. 文件所有者指向视图为视图。
  5. 文本字段使用文件的所有者代表

它看起来像这样...

enter image description here

被正确显示的视图,但只要我点击文本字段与异常应用程序崩溃“EXC_BAD_ACCESS ......”

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


其他发现。当我在AppDelegate中直接实例化这个视图控制器时,UITextField的委托实际上起作用!

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

作为参考。在我的应用程序委托:

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

在董事会类我有一个“添加”按钮触发CardViewControllers

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

,然后看起来在第一次提到了代表团作为CardViewController的创建在xib中设置。

+0

是的。真正。谢谢。我忘了在测试后直接在AppDelegate中实例化CardViewController来更改它。我纠正了它。 – Bernd

它看起来像我找到我的解决方案。我不需要仅将CardViewController的视图添加为子视图,而是需要将其添加为ChildViewController。

在父BoardViewController

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

然后则委托调用的作品。好极了。

看起来像您的CardViewController未初始化。你认为它应该在哪里建造?

+0

但是它是通过“CardViewController * cvc = [[CardViewController alloc] init]; [self.view addSubview:cvc.view];”它正在显示。只有当我点击文本框时,应用程序崩溃。 – Bernd

+0

它应该通过initWithNibName构造,因为它存储在nib中。 –

+0

我认为init应该以相同的名字自动获取正确的nib/xib。无论如何,我试过“CardViewController * cvc = [[CardViewController alloc] initWithNibName:@”CardViewController“bundle:nil]”。不幸的是它仍然崩溃。 – Bernd

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

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委托。用属性初始化textField并建立连接File Owner。

使用断点调试您的代码。我希望这能帮到您。