以编程方式将委托实例化到组件

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。这不是一件好事。我不知道它对你有什么用。

以上是关于以编程方式将委托实例化到组件的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式实例化 vuetify-components

无需 nib 以编程方式实例化 UIViewController

如何从 QML 中的 GridView 或 ListView 获取实例化的委托组件

如何通过以编程方式将根(选项卡 ViewController)从子选项卡设置为未实例化的不同 VC

以编程方式在Sharepoint中实例化Web部件页面

以编程方式(但不是以声明方式)实例化小部件时出现 Dojo 重复 ID 错误