0

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

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

看起来像这样...

在此处输入图像描述

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

4

3 回答 3

0

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

于 2013-01-06T11:37:57.777 回答
0

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

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 并建立连接文件所有者。

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

于 2013-01-06T12:01:54.797 回答
0

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

在父 BoardViewController

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

然后委托调用工作。耶。

于 2013-01-06T16:07:49.073 回答