我有一个应用程序,它有一个控制器,已经为文本字段处理UITextFieldDelegate,现在我想以编程方式添加第二个控制器+ UITextField,它与主控制器分开,但是从它调用。
所以我有一个MainController处理输入(正在工作),然后在那旁边,我定义了这个:
@interface TestUIDelegate : UIViewController <UITextFieldDelegate>{
TestUIDelegate有一个属性textField。
TestUIDelegate有一个方法:
- (void)initGUI:(UIView *)myView;
初始化textField,如下所示:
- (void)initGUI:(UIView *)myView {
self.view = myView;
textField = [[UITextField alloc] initWithFrame:CGRectMake(10, 200, 300, 40)];
textField.borderStyle = UITextBorderStyleRoundedRect;
textField.font = [UIFont systemFontOfSize:15];
textField.placeholder = @"enter text";
textField.autocorrectionType = UITextAutocorrectionTypeNo;
textField.keyboardType = UIKeyboardTypeDefault;
textField.returnKeyType = UIReturnKeyDone;
textField.clearButtonMode = UITextFieldViewModeWhileEditing;
textField.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter;
textField.delegate = self;
[self.view addSubview:textField];
}
也有效;该字段显示并且可编辑,键盘出现,您可以键入内容。
到目前为止一切顺利,但现在我想完成按钮工作,键盘被解雇,所以我补充道:
- (BOOL)textFieldShouldEndEditing:(UITextField *)textField{
NSLog(@"Here?");
return YES;
}
- (void)textFieldDidEndEditing:(UITextField *)textField{
NSLog(@"Or here?");
}
到我的TestUIDelegate(实际上我添加了TextUIFieldDelegate的所有委托方法)。
我从MainController中的didFinishLaunchingWithOptions实例化TestUIDelegate,如下所示:
TestUIDelegate *controller = [[TestUIDelegate alloc] init];
[controller initGUI:self.view];
TextField仍然显示从不调用委托方法,没有一个。现在我想我正在做一些非常奇怪的事情,我已经查看了SO上的所有答案,并且谷歌稍微与此有关,但他们都是通过在MainController中实现委托来实现的,这正是我真正不想要的。我需要它以编程方式;没有(根本)与gui建设者。
有人可以开导我吗?我不认为我会自己解决这个问题。
答案 0 :(得分:2)
您需要添加textFieldShouldReturn才能让键盘解除:
- (BOOL)textFieldShouldReturn:(UITextField *)textField{
[textField resignFirstResponder];
return YES;
}
然后也会调用TextFieldDidEndEditing,但在此之前你需要resignFirstResponder。
答案 1 :(得分:1)
我发现问题是什么(但不是为什么......);我正在使用
[controller initGUI:self.view];
将其更改为:
[controller initGUI:self.window.rootViewController.view];
让它发挥作用。我不知道为什么。
对于有兴趣做同样事情的人(就像我说的那样;我在网上找不到一个例子),这是简化的项目; https://dl.dropboxusercontent.com/u/6134596/TestDelegate.zip