以编程方式将委托实例化到组件
Posted
技术标签:
【中文标题】以编程方式将委托实例化到组件【英文标题】:Programmatically instantiating a Delegate to a component 【发布时间】:2013-04-25 23:54:28 【问题描述】:我有一个应用程序,它的控制器已经为文本字段处理 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 构建器。
谁能给我指点一下?我不认为我会自己解决这个问题。
【问题讨论】:
你是怎么调用这个控制器和调用方法initGUI的? 像这样 TestUIDelegate *controller = [[TestUIDelegate alloc] init]; [控制器initGUI:self.view];来自 MainController 的 didFinishLaunchingWithOptions。 不,我没有使用 ARC(它已关闭)。 【参考方案1】:您需要添加 textFieldShouldReturn 以使键盘关闭:
- (BOOL)textFieldShouldReturn:(UITextField *)textField
[textField resignFirstResponder];
return YES;
TextFieldDidEndEditing 也会被调用,但在此之前您需要 resignFirstResponder。
【讨论】:
问题是没有一个代表被调用。不是这个或其他任何一个。这就是问题所在,我不知道为什么会这样。 我有;在那里;不幸的是,同样的行为:( @CharlesS,好吧,我复制了你的代码,它对我来说很好用。您应该在应用程序委托中发布代码(我假设这就是 MainController 的意思)。 不,这就是重点;我不想让 MainController 成为委托;我希望我的 TestUIDelegate 成为代表。如果我使用 MainController 它可以工作,但不幸的是,这对我想要实现的目标完全没用。 @CharlesS,我不是指文本字段的委托,我指的是应用程序委托——didFinishLaunchingWithOptions 方法所在的那个。我希望你把代码贴在那里,而不是更改您的代码。【参考方案2】:我发现了问题所在(但不知道为什么......);我正在使用
[controller initGUI:self.view];
将其更改为:
[controller initGUI:self.window.rootViewController.view];
让它工作。我不知道为什么。
对于有兴趣做同样事情的人(就像我说的;我在网上找不到一个例子),这里是简化的项目; https://dl.dropboxusercontent.com/u/6134596/TestDelegate.zip
【讨论】:
self.view 是什么?这是从哪里来的? 你在 Dropbox 上的项目在我运行时崩溃了。 @property (nonatomic, 保留) IBOutlet UIView *view;它连接在构建器中。我以为这是根视图,但那可能是错误的? 崩溃? :) 哦,这很奇怪;它在这里运行良好...我在 ios 5+6 中尝试过。筛选; dl.dropboxusercontent.com/u/6134596/… 它给了我“一个视图一次最多只能与一个视图控制器相关联!”您正在查看您的根视图控制器并将其分配给您的 TestUIDelegate。这不是一件好事。我不知道它对你有什么用。以上是关于以编程方式将委托实例化到组件的主要内容,如果未能解决你的问题,请参考以下文章
无需 nib 以编程方式实例化 UIViewController
如何从 QML 中的 GridView 或 ListView 获取实例化的委托组件