UIButtons不启用其他按钮

时间:2012-05-01 20:53:02

标签: iphone objective-c xcode ios5

通过这个板上人们的精彩帮助,我几乎为我的学生完成了我的应用程序!我能够在键盘上显示一个工具栏,它有一个前一个和下一个按钮。然后,我将按钮放在三个输入字段之间。

如果用户在第一个字段中开始,他们可以在所有字段之间来回切换,就像我认为他们使用prev / next按钮一样。但是,如果用户在文本字段3上,然后单击第一个字段,则按钮保持不变,然后无法正常工作。

-(void)keyboardWillShow:(id)sender{
    if ([inputA isFirstResponder]) {
        [nextButton setEnabled:YES];
        [previousButton setEnabled:NO];
    } else if ([inputB isFirstResponder]) {
        [nextButton setEnabled:YES];
        [previousButton setEnabled:YES];
    } else if ([inputC isFirstResponder]) {
        [nextButton setEnabled:NO];
        [previousButton setEnabled:YES];
    }
}

...循环浏览下一个文本字段

-(void)nextField:(id)sender{
    if ([inputA isFirstResponder]) {
        [inputB becomeFirstResponder];
        [previousButton setEnabled:YES];
        [nextButton setEnabled:YES];
    } else if ([inputB isFirstResponder]) {
        [inputC becomeFirstResponder];
        [previousButton setEnabled:YES];
        [nextButton setEnabled:NO];
    } else if ([inputC isFirstResponder]) {
        [inputB becomeFirstResponder];
        [previousButton setEnabled:YES];
        [nextButton setEnabled:YES];
    }
}

...循环显示以前的文本字段

-(void)previousField:(id)sender{
    if ([inputC isFirstResponder]) {
        [inputB becomeFirstResponder];
        [nextButton setEnabled:YES];
        [previousButton setEnabled:YES];
    } else if ([inputB isFirstResponder]) {
        [inputA becomeFirstResponder];
        [nextButton setEnabled:YES];
        [previousButton setEnabled:NO];
    } else if ([inputA isFirstResponder]) {
        [inputB becomeFirstResponder];
        [nextButton setEnabled:YES];
        [previousButton setEnabled:YES];
    }
}

在我的键盘代码中,上一个按钮调用previousField,下一个按钮调用nextField。我想当我使用keyboardWillShow时,我将不同的输入设置为第一响应者,但这只是在第一次运行时。

有没有办法在用户点击字段时成为第一个响应者?

2 个答案:

答案 0 :(得分:1)

至于触发更新,UITextField有一个委托方法-textFieldDidBeginEditing:,您可以根据@mackworth的建议调用-setPrevNextButtons。还有其他几种做类似事情的方法 - 有关详细信息,请参阅related delegate protocol

例如,在文本字段的委托中尝试此控制代码:

- (void)textFieldDidBeginEditing:(UITextField *)textField {
    if (textField == inputA || textField == inputB || textField == inputC)
        [self setPrevNextButtons];
}

不言而喻,您必须为文本字段设置委托才能使其正常工作。

答案 1 :(得分:0)

我可以建议两件事:首先,干它:“不要重复自己”。只要您反复看到相同的代码,请将其移至方法。其次,你没有指定谁调用keyboardWillShow。检查你的nib,在EditingDidBegin上每个inputX调用它。所以更短的代码是:

-(void) setPrevNextButtons {  //ensures that Prev/Next buttons are correct for current firstResponder
    if ([inputA isFirstResponder]) {
        [nextButton setEnabled:YES];
        [previousButton setEnabled:NO];
    } else if ([inputB isFirstResponder]) {
        [nextButton setEnabled:YES];
        [previousButton setEnabled:YES];
    } else if ([inputC isFirstResponder]) {
        [nextButton setEnabled:NO];
        [previousButton setEnabled:YES];
    }
}

-(void)keyboardWillShow:(id)sender{
    [self setPrevNextButtons];
}

//goes through the different text fields
-(void)nextField:(id)sender{

    if ([inputA isFirstResponder]) {
        [inputB becomeFirstResponder];
    }else if ([inputB isFirstResponder]) {
        [inputC becomeFirstResponder];
    }    
    [self setPrevNextButtons];
}

-(void)previousField:(id)sender{
    if ([inputC isFirstResponder]) {
        [inputB becomeFirstResponder];
    } else if ([inputB isFirstResponder]) {
        [inputA becomeFirstResponder];
    }
    [self setPrevNextButtons];

}

如果你觉得自己很棘手,你也可以这样做:

-(void) setPrevNextButtons {
    [previousButton setEnabled: [inputB isFirstResponder] || 
                                [inputC isFirstResponder]  ];
    [nextButton setEnabled: [inputA isFirstResponder] || 
                            [inputB isFirstResponder]  ];
}