【问题标题】:UITextField not calling delegate methodUITextField 没有调用委托方法
【发布时间】:2012-09-26 19:33:05
【问题描述】:

我有一个DetailViewController,它的实现文件包含这段代码:

#import <UIKit/UIKit.h>

@interface DetailViewController : UIViewController <UITextFieldDelegate>

{
    __weak IBOutlet UITextField *nameField;
    __weak IBOutlet UITextField *numberField;
}

@end

在我的故事板中,我将ViewController 设置为DetailViewController,并将我的两个UITextFields 的代表连接到我的DetailViewController。我的DetailViewController 的实现文件包含这种在点击文本字段以外的地方时关闭键盘的方法:

- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
    [textField resignFirstResponder];
    return YES;
}

虽然没有调用此方法,但我已使用断点对其进行了测试。可能出了什么问题?

【问题讨论】:

  • 你是不是在里面放了一条日志语句来看看它是否被调用了?当用户点击返回按钮时调用此方法,而不是在点击文本字段以外的地方时调用。
  • 在您的 VDL 中添加 NSLog(@"DELEGATE =&gt; %@", nameField.delegate); 以查看是否确实设置了委托?

标签: objective-c xcode delegates uitextfield storyboard


【解决方案1】:

rdelmar 是正确的,只有当用户点击键盘上的“return”键时才会触发您的代码,而不是当他们在键盘外单击时触发。

要获得您正在寻找的行为,我会在您的文本字段后面的视图中添加一个点击手势识别器,然后将[nameField resignFirstResponder];[numberField resignFirstResponder]; 放入点击手势识别器的代码中。

【讨论】:

  • 谢谢,我不知道!我已经添加了点击手势识别器,现在它工作正常。 :)
【解决方案2】:
  • 我创建了一个示例项目
  • 添加到视图控制器
  • 添加了一个文本字段并连接了它的委托
  • 在视图控制器中编写代码

     (BOOL)textFieldShouldReturn:(UITextField *)textField
     {
        [textField resignFirstResponder];
        return YES; 
     }
    

它工作得很好。试过弱它也可以作为实例变量和属性

所以检查你是否在任何地方重新分配它,并使用断点检查它的内存是否相同

【讨论】:

    【解决方案3】:

    你为什么使用_weak?删除它。

    在您的 .m 文件中执行(在 viewDidLoad 中):

    [nameField setDelegate:self];
    

    其他文本字段也一样。

    【讨论】:

    • weak 对于 IBOutlets 来说很好,在 IB 中设置委托也应该可以正常工作。事实上,出口与手头的问题无关——即使没有出口名称,代表也应该工作。
    • 以编程方式完成这一切可以节省大量工作和错误。您不知道在构建与 xib 的连接时会发生什么。如果您以编程方式完成所有操作,您可以更轻松地发现错误和内容
    猜你喜欢
    • 1970-01-01
    • 2011-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多