同时在自定义 UIView 和 UIViewController 中使用相同的 UITextFieldDelegate 方法

Posted

技术标签:

【中文标题】同时在自定义 UIView 和 UIViewController 中使用相同的 UITextFieldDelegate 方法【英文标题】:Using same UITextFieldDelegate methods in custom UIView and in UIViewController simultaneously 【发布时间】:2014-04-17 02:38:36 【问题描述】:

我有一个UIView(名为 HCTextFieldView),上面有子视图:UITextFieldUILabel

UITextField's委托等于自己。委托方法textFieldDidBeginEditingtextFieldDidEndEditing 执行文本字段的背景高亮效果。

接下来我将在我的UIViewController 中使用这个自定义UIView (HCTextFieldView)。要处理工具栏中的“下一个”和“上一个”按钮的操作(附加在文本字段的键盘上方),我需要 UIViewController 中相同的文本字段的委托方法,委托被覆盖。

**@interface HCBaseTextField : UIView <UITextFieldDelegate>**
...
@end

**@implementation HCBaseTextField **

...

textField = [[UITextField alloc] initWithFrame:CGRectMake(0, titleLabel.bottom, self.width - 20, self.height - titleLabel.height)];
**textField.delegate = self**;

...

#pragma mark - UITextField delegate

//textFieldBG - UIImageView that act as background

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField 
    [textFieldBg setImage:[[UIImage imageWithName:@"btn_vvod_medium_act"] stretchableImageWithLeftCapWidth:10 topCapHeight:10]];
    return YES;


- (BOOL)textFieldShouldEndEditing:(UITextField *)textField 
    [textFieldBg setImage:[[UIImage imageWithName:@"btn_vvod_medium_norm"] stretchableImageWithLeftCapWidth:10 topCapHeight:10]];
    return YES;


...

@end


**ViewController : UIViewController**

...

HCTextFieldView *textFieldView = [[HCTExtFieldView alloc] init];
textFieldView.textField.delegate = self;

...

//I need to use this methods too but they override previous in UIView delegate
- (void)textFieldDidBeginEditing:(UITextField *)textField

    [self.keyboardControls setActiveField:textField];


- (void)textViewDidBeginEditing:(UITextView *)textView

    [self.keyboardControls setActiveField:textView];

【问题讨论】:

【参考方案1】:

HCBaseTextField 中设置一个delegate 喜欢

HCBaseTextField.h中添加一个属性

@property (nonatomic, assign) id<UITextFieldDelegate> textFieldDelagate;

HCBaseTextField.m

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField 

    ....
    if (self.textFieldDelagate && [self.textFieldDelagate respondsToSelector:@selector(textFieldShouldBeginEditing:)]) 
        [self.textFieldDelagate textFieldShouldBeginEditing:textField];
    
    return YES;


- (void) textFieldDidBeginEditing:(UITextField *)textField 
    ....

    if (self.textFieldDelagate && [self.textFieldDelagate respondsToSelector:@selector(textFieldDidBeginEditing:)]) 
        [self.textFieldDelagate textFieldDidBeginEditing:textField];
    


... //Other delegate methods if needed

ViewController 中:UIViewController

...

HCTextFieldView *textFieldView = [[HCTExtFieldView alloc] init];

textFieldView.textFieldDelagate = self;

...

并实现委托方法。

- (void) textFieldDidBeginEditing:(UITextField *)textField 
    ....

    //Do the stuff

【讨论】:

以上是关于同时在自定义 UIView 和 UIViewController 中使用相同的 UITextFieldDelegate 方法的主要内容,如果未能解决你的问题,请参考以下文章

在自定义 UIview 中设置 UItableview 的委托和数据源

touchesBegin 在自定义 UITableViewCell,touchesEnded 在 UIView

在自定义 UIView 中为部分自动调整 UITableView

XCode:在自定义 UIView 的顶部分层一个按钮

如何在自定义 UIView 下方的 MKMapview 中启用 touchEvents(滚动和平移)?

何时在自定义 UIVIew 中添加 CAAnimation?