iOS Objective-C应用inputAccessoryView无法显示问题求助
解决iOS Objective-C中键盘顶部自定义栏不显示的问题
看起来你在给键盘加自定义顶部栏时遇到了显示问题,我帮你梳理下代码里的疏漏,再给你完整的实现方案:
首先,你的核心思路是对的,但有几个关键步骤没做完整,导致栏不显示:
常见问题排查
- 你没给作为
inputAccessoryView的myUIView设置有效尺寸:如果frame是xxx这种占位值,系统不知道该怎么渲染这个视图,自然看不到 - 代码写到
setInputAccessoryView就断了:必须把创建好的自定义栏赋值给某个文本输入控件(比如你的myTextfield)的inputAccessoryView属性,不然系统不知道该把这个栏绑定到哪个键盘上 - 可能你的
myTextfield没被添加到视图层级,或者从未成为第一响应者:只有当输入控件激活弹出键盘时,inputAccessoryView才会跟着显示
完整的可运行代码示例
- (void)viewDidLoad { [super viewDidLoad]; // 1. 创建自定义键盘顶部栏,设置合适的高度(一般44pt符合iOS设计规范) CGFloat accessoryHeight = 44.0f; UIView *myUIView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, accessoryHeight)]; myUIView.backgroundColor = [UIColor lightGrayColor]; // 设个背景色方便调试查看 // 2. 创建栏里的UITextView,设置frame填满整个栏(也可以按需调整位置尺寸) UITextView *myTextView = [[UITextView alloc] initWithFrame:myUIView.bounds]; myTextView.backgroundColor = [UIColor whiteColor]; myTextView.font = [UIFont systemFontOfSize:16]; // 给TextView加个占位符(UITextView默认没有,简单实现下) myTextView.text = @"点击这里输入"; myTextView.textColor = [UIColor lightGrayColor]; // 给TextView加点击逻辑,确保点击时能正常激活输入 [myTextView addTarget:self action:@selector(textViewDidBeginEditing:) forControlEvents:UIControlEventEditingDidBegin]; [myUIView addSubview:myTextView]; // 3. 创建页面上的目标输入控件(比如UITextField,也可以是UITextView) UITextField *myTextfield = [[UITextField alloc] initWithFrame:CGRectMake(50, 100, 300, 44)]; myTextfield.borderStyle = UITextBorderStyleRoundedRect; myTextfield.placeholder = @"点击弹出键盘"; [self.view addSubview:myTextfield]; // 最关键的一步:把自定义栏绑定到输入控件的inputAccessoryView myTextfield.inputAccessoryView = myUIView; } // 处理TextView的编辑开始事件,切换文本颜色 - (void)textViewDidBeginEditing:(UITextView *)textView { if ([textView.text isEqualToString:@"点击这里输入"]) { textView.text = @""; textView.textColor = [UIColor blackColor]; } }
额外提示
- 如果你希望多个输入控件共用同一个顶部栏,直接把
myUIView赋值给它们的inputAccessoryView即可,不用重复创建 inputAccessoryView的宽度会自动适配屏幕,所以你设置的宽度值其实可以忽略,直接写0也没问题,系统会自动调整- 如果你的
myTextView点击后没反应,检查下它的userInteractionEnabled是否为YES(默认是YES),或者有没有被其他视图遮挡
内容的提问来源于stack exchange,提问作者Laurent Crivello
相关产品推荐
相关产品推荐

