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

仅在文本框输入后启用按钮:苹果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;
            }
    }
    
}
问题分析
  1. 触发时机错误:按钮状态判断放在textFieldDidBeginEditing方法中,该方法仅在用户开始编辑文本框时触发,无法实时响应输入内容的变化(比如输入后删除、切换输入框等场景)
  2. 逻辑判断完全颠倒:当前条件是「两个输入框都为空时启用按钮」,和需求「有内容才启用」完全相反
  3. 冗余操作:[textField becomeFirstResponder]是多余的(进入该方法时文本框已是第一响应者);每次开始编辑就清空文本框的逻辑也会影响用户体验
  4. 崩溃隐患未根除:即使按钮启用逻辑修复,仍需在点击方法中增加校验,避免极端情况导致崩溃
解决方案

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 20:05:17