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 时出错