将 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 示例代码 [关闭]