如何在 XIB 中调用 UITextField 的委托方法?

Posted

技术标签:

【中文标题】如何在 XIB 中调用 UITextField 的委托方法?【英文标题】:How do I call delegate methods for a UITextField within a XIB? 【发布时间】:2018-05-16 00:59:34 【问题描述】:

我有一个 XIB ProfileView 包含在自定义 UIViewControllerAlarm 中。 ProfileView 有一个子视图UITextView,我想从我的自定义类Alarm 中调用UITextView 委托方法而不是ProfileView,因为我关于UITextView 文本的所有逻辑都在我的@987654332 中@ 班级。所以我的问题是:如果UITextViewProfileView 的子视图,我可以从我的Alarm 类中调用UITextView 委托方法吗?换句话说,我可以将UITextView 委托设置为Alarm 而不是self

【问题讨论】:

你是说你想要 UITextField 的 两个 代表吗? “访问委托方法”是什么意思?委托方法由请求对象调用,而不是您自己“访问”的东西。一个对象应该有一个唯一的委托,所以如果您希望多个对象被通知 UITextField 中的某些更改,那么注册通知可能更合适?不确定您要完成什么,所以也许您可以为您的问题添加更多上下文。 @christopherdrum 感谢您增加清晰度。我已经编辑了我的问题。希望我在问什么是有道理的。我只想从Alarm 而不是ProfileView 调用我的UITextView 委托方法。 @AustinBerenyi 对不起,但我能知道为什么我的答案不能被接受为正确答案吗?您的问题具有objective-c 标签,并且您将Swift 答案标记为正确答案。还有一个,我的答案是较早的答案。公平点! @trungduc 很抱歉这个错误。您的答案应该首先被标记为正确答案。感谢您的帮助! 【参考方案1】:

连接并将UITextView 设为ProfileView 的公共属性

@interface ProfileView : UIView
@property (weak, nonatomic) IBOutlet UITextView *textView;
@end

在您的Alarm 类中,设置self.profileView.textView.delegate = self 并实现您需要的功能,或者如果profileView 不是Alarm 的属性,请在初始化后设置委托。

@interface Alert : UIViewController <UITextViewDelegate>

@property (nonatomic, strong) ProfileView* profileView;

@end

// In |viewDidLoad| or anywhere after you initialize |_profileView|
self.profileView.textView.delegate = self;

【讨论】:

【参考方案2】:

是的,你可以。

通过Alarm中的代码:

func viewDidLoad() 
    super.viewDidLoad()

    // If you have the UITextField @IBOutlet in your Alarm
    textField.delegate = self

    // If it's owned by ProfileView
    profileView.textField.delegate = self

确保Alarm 符合UITextFieldDelegate


或者使用 Interface Builder,首先像这样从 UITextField 拖动到 Alarm 对象:

然后选择委托

【讨论】:

以上是关于如何在 XIB 中调用 UITextField 的委托方法?的主要内容,如果未能解决你的问题,请参考以下文章

在自定义单元格(xib)中滚动时,UITextField 中的文本消失

当点击 UITextField 时,加载 nib 文件以充当自定义键盘

如何在 iphone 中增加 UITextField 的高度

如何使用相同的 UIDatePicker 分别在 2 UITextField 中获取日期和时间

UITextField 键盘无法输入任何内容

RTL iOS9上奇怪的UITextField占位符行为