仅在文本框输入后启用按钮:苹果App拒审及代码问题求助
问题描述
- 我的App此前多年通过审核,近期被苹果拒绝
- App包含两个UITextField(用于输入姓氏、名字),点击Go按钮提交内容
- 苹果反馈直接点击Go按钮会导致App崩溃,但我本地测试仅会弹出错误提示
No name - please reenter - 为满足审核要求,我修改了文本框编辑方法(代码如下),但始终无法实现「仅当两个输入框都有内容时才启用Go按钮」的需求
// Text Field methods -(void)textFieldDidBeginEditing:(UITextField *)textField { UIFont* boldFont = [UIFont fontWithName:@"Helvetica-Bold" size: 24]; if (textField == _lastName) { [_lastName becomeFirstResponder]; [_lastName setFont:boldFont]; _lastName.autocorrectionType = UITextAutocorrectionTypeNo;; _lastName.autocapitalizationType = UITextAutocapitalizationTypeNone; _lastName.text = @""; NSLog(@"user editing last..."); // Enable button once fields have values if ([_lastName.text isEqual: @""] && [_firstName.text isEqual: @""]) { _fwdButton.enabled = YES; } } else { [_firstName becomeFirstResponder]; [_firstName setFont:boldFont]; _firstName.autocorrectionType = UITextAutocorrectionTypeNo;; _firstName.autocapitalizationType = UITextAutocapitalizationTypeNone; _firstName.text = @""; NSLog(@"user editing first"); // Enable button once fields have values if ([_lastName.text isEqual: @""] && [_firstName.text isEqual: @""]) { _fwdButton.enabled = YES; } } }
问题分析
- 触发时机错误:按钮状态判断放在
textFieldDidBeginEditing方法中,该方法仅在用户开始编辑文本框时触发,无法实时响应输入内容的变化(比如输入后删除、切换输入框等场景) - 逻辑判断完全颠倒:当前条件是「两个输入框都为空时启用按钮」,和需求「有内容才启用」完全相反
- 冗余操作:
[textField becomeFirstResponder]是多余的(进入该方法时文本框已是第一响应者);每次开始编辑就清空文本框的逻辑也会影响用户体验 - 崩溃隐患未根除:即使按钮启用逻辑修复,仍需在点击方法中增加校验,避免极端情况导致崩溃
解决方案
1. 绑定文本框内容变化事件
在viewDidLoad中给两个UITextField添加editingChanged事件监听,实时响应内容变化:
- (void)viewDidLoad { [super viewDidLoad]; // 绑定文本框内容变化事件 [_lastName addTarget:self action:@selector(textFieldTextChanged:) forControlEvents:UIControlEventEditingChanged]; [_firstName addTarget:self action:@selector(textFieldTextChanged:) forControlEvents:UIControlEventEditingChanged]; // 初始化时设置按钮状态 [self updateForwardButtonState]; }
2. 实现按钮状态校验方法
创建单独方法统一处理按钮启用逻辑,同时去除输入内容两端空白字符,避免用户输入空格绕过校验:
- (void)updateForwardButtonState { NSString *trimmedLastName = [_lastName.text stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]]; NSString *trimmedFirstName = [_firstName.text stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]]; // 两个输入框都有非空内容时启用按钮 _fwdButton.enabled = (trimmedLastName.length > 0 && trimmedFirstName.length > 0); }
3. 简化textFieldDidBeginEditing方法
只保留必要的样式设置,移除错误的按钮判断逻辑:
-(void)textFieldDidBeginEditing:(UITextField *)textField { UIFont* boldFont = [UIFont fontWithName:@"Helvetica-Bold" size:24]; [textField setFont:boldFont]; textField.autocorrectionType = UITextAutocorrectionTypeNo; textField.autocapitalizationType = UITextAutocapitalizationTypeNone; // 若不需要开始编辑时清空内容,可移除以下行 // textField.text = @""; if (textField == _lastName) { NSLog(@"user editing last..."); } else { NSLog(@"user editing first"); } // 开始编辑时更新按钮状态 [self updateForwardButtonState]; }
4. 实现内容变化回调方法
- (void)textFieldTextChanged:(UITextField *)textField { [self updateForwardButtonState]; }
5. 修复Go按钮点击逻辑
即使按钮已做启用控制,仍需在点击方法中再次校验,彻底避免崩溃:
- (IBAction)forwardButtonTapped:(UIButton *)sender { NSString *trimmedLastName = [_lastName.text stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]]; NSString *trimmedFirstName = [_firstName.text stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]]; if (trimmedLastName.length == 0 || trimmedFirstName.length == 0) { UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"提示" message:@"No name - please reenter" preferredStyle:UIAlertControllerStyleAlert]; [alert addAction:[UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleDefault handler:nil]]; [self presentViewController:alert animated:YES completion:nil]; return; } // 执行原本的提交逻辑 }
内容的提问来源于stack exchange,提问作者user3741598
相关产品推荐
相关产品推荐

