同时在自定义 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),上面有子视图:UITextField
和 UILabel
。
UITextField's
委托等于自己。委托方法textFieldDidBeginEditing
和textFieldDidEndEditing
执行文本字段的背景高亮效果。
接下来我将在我的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