将 UITextFieldDelegate 传递给 UIViewController 帮助器类

Posted

技术标签:

【中文标题】将 UITextFieldDelegate 传递给 UIViewController 帮助器类【英文标题】:Passing a UITextFieldDelegate to UIViewController helper class 【发布时间】:2016-07-29 12:02:10 【问题描述】:

我有一个看起来像这样的辅助类:

(我们称之为 GUI.H & GUI.M 文件)

(DOT .H 文件)

- (CGGroup)addLabelTextField:(UIViewController*)vc deligate:(id<UITextFieldDelegate>)deligate textField:(UITextField*)textField;

(DOT .M 文件)

- (CGGroup)addLabelTextField:(UIViewController*)vc deligate:(id<UITextFieldDelegate>)deligate textField:(UITextField*)textField


     // Blah, Blah Blah Blah Set Up & Configure Label & Textfield... 10 lines 

     // DONE Allocating & Configuring OK 

    // Last 3 Lines -- this is where the Deligate gets SET and the problems
    textField.delegate = deligate; // <- this is what is NOT happening
    [vc.self.view addSubview:textField]; // this adds TextField to passed in UIViewController
    return(cgTmp); // nothing to see here just a typedef of CGRect's


我将 ViewController、textField 和 textFieldDeligate 的指针传入并以编程方式设置它们(没有 xib 的任何东西)

Alloc、set 等,就像您在要使用的视图控制器中创建/配置一个文本字段或标签一样,只是通过帮助程序类设置所有内容。所以添加字段是一个调用,而不是所有通常的配置......

问题: 一切似乎都运行良好,除了 TextFieldDeligate 函数没有被调用(clang -- 没有警告,什么都没有......)

如果我将相同的代码移回调用类 (uiViewController) 突然,代表们接到电话,一点问题都没有……

另一个问题:一旦设置了测试字段,您将无法更改内容,即... SecureText = TRUE 到 FALSE .... 什么也没有发生,再次将这段代码移回调用 viewController 时,突然一切正常正如所宣传的那样......

我怀疑与传递“UITextFieldDeligate”的方式有关,但正如我所提到的,clang 没有发出任何警告...无...

UIViewController 当然设置为支持代理 并且属性被声明... (如果我将这些东西移回类(UIViewController)中(没有单独的类来设置这些字段)它工作正常......

方法被调用:

SomeUIViewController.M(这是我们调用 GUI.H & M 中定义的函数的地方)

[self.gui addTextField:self textField:self.passField deligate:self.passField.delegate];

是的,UITextField 有一个属性,并且该类声明了协议

SomeUIViewController.H

@interface SomeUIViewController : UIViewController <UITextFieldDelegate>



@property (nonatomic, strong) GuiUtils *gui;
@property (nonatomic, strong) UITextField *userField;
@property (nonatomic, strong) UITextField *passField;
@property (nonatomic, strong) UITextField *tmpField;

正如我提到的 b4,我遇到的唯一问题是 UIViewController 中的 deligate 方法(与此 UITextField 相关)没有被调用...

(但我认为这可能很简单,因为我刚刚注意到我没有将 deligate 作为指针传递......所以它可能已经解决了)

提前谢谢.....

【问题讨论】:

你的方法调用没有意义。请发布正确的代码。 这是“方法”调用:“[self.gui addTextField:self textField:self.passField deligate:self.passField.delegate];”你不明白哪一部分..?我很乐意向您解释。 OK.... 未调用的代表已修复!我传递的是“UITextField.delegate”的委托,而不是 UIViewController“self”的委托所以委托现在被调用,但在将 TextField 添加到子视图后仍然存在设置 TextField 某些属性的问题......我无法更改“textField.secureTextEntry”,这是在将完全相同的代码移入调用 UIViewController 时起作用的其他东西... 【参考方案1】:

好的....没有被调用的代表是固定的! 我传递的是“UITextField.delegate”的委托,而不是 UIViewController“self”的委托

发件人:

[self.gui addTextField:self textField:self.passField deligate:self.passField.delegate];

收件人:

[self.gui addTextField:self textField:self.passField deligate:self];

【讨论】:

以上是关于将 UITextFieldDelegate 传递给 UIViewController 帮助器类的主要内容,如果未能解决你的问题,请参考以下文章

当我遵守协议时,关于分配给 id<UITextFieldDelegate> 的警告

UITextFieldDelegate 崩溃 (exc_bad_access)

在 Swift 中创建 UITextFieldDelegate 以限制字符数

我正在寻找 UITextFieldDelegate 示例代码 [关闭]

ViewController 实现 UITextFieldDelegate 时出错

UITextFieldDelegate:如何选择为每个单独的 TextField 调用哪些方法