Xcode9.2中UITextView子类设置inputAccessoryView报错如何解决?
解决UITextView子类设置inputAccessoryView的只读属性问题
嘿,我来帮你搞定这个头疼的问题~
问题原因
首先得搞清楚为什么会报错:
- UITextView继承自
UIResponder,而UIResponder中的inputAccessoryView是只读属性(声明为readonly),系统并没有提供对应的setter方法。所以你直接用self.myTextView.inputAccessoryView = myView;赋值,或者尝试调用setInputAccessoryView:都会报错——前者提示只读,后者找不到对应的方法。 - 这里容易和
UITextField搞混,UITextField的inputAccessoryView是可读写的,但UITextView遵循UIResponder的规则,不能直接赋值。
正确的设置方法
要给UITextView子类设置输入辅助视图,你需要重写子类的inputAccessoryView getter方法,具体步骤如下:
1. 在子类的.m文件中声明私有属性(保存自定义视图)
先在.m文件的类扩展里添加一个私有属性,用来存储你的自定义辅助视图:
@interface customTextView () @property (nonatomic, strong) UIView *myAccessoryView; // 私有属性,保存自定义辅助视图 @end
2. 重写inputAccessoryView的getter方法
在.m文件里实现getter方法,用懒加载的方式初始化你的自定义视图:
- (UIView *)inputAccessoryView { if (!_myAccessoryView) { // 初始化你的自定义视图,这里以一个带“完成”按钮的工具栏为例 _myAccessoryView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, 44)]; _myAccessoryView.backgroundColor = [UIColor lightGrayColor]; // 添加完成按钮 UIButton *doneButton = [[UIButton alloc] initWithFrame:CGRectMake([UIScreen mainScreen].bounds.size.width - 80, 0, 60, 44)]; [doneButton setTitle:@"完成" forState:UIControlStateNormal]; [doneButton setTitleColor:[UIColor blueColor] forState:UIControlStateNormal]; [doneButton addTarget:self action:@selector(doneButtonTapped:) forControlEvents:UIControlEventTouchUpInside]; [_myAccessoryView addSubview:doneButton]; } return _myAccessoryView; } // 按钮点击事件示例 - (void)doneButtonTapped:(UIButton *)sender { [self resignFirstResponder]; // 收起键盘 }
3. 动态更新辅助视图(可选)
如果你需要在运行时动态修改辅助视图的内容,比如隐藏/显示、修改控件,可以直接修改_myAccessoryView的属性,然后调用[self reloadInputViews]来刷新输入视图:
- (void)updateAccessoryViewWithNewTitle:(NSString *)title { // 假设你要修改按钮标题,建议给控件加tag方便查找 UIButton *doneButton = (UIButton *)[_myAccessoryView viewWithTag:100]; [doneButton setTitle:title forState:UIControlStateNormal]; [self reloadInputViews]; // 刷新输入视图 }
这样设置后,当你的customTextView成为第一响应者时,系统会自动调用你重写的getter方法,显示你自定义的输入辅助视图啦~
内容的提问来源于stack exchange,提问作者Gefilte Fish
相关产品推荐
相关产品推荐

