You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 10:22:14