2

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

如果用户从第一个字段开始,他们可以在所有字段之间来回切换,就像我认为如果他们使用 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时,我将不同的输入设置为第一响应者,但这只是在第一次运行时。

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

4

2 回答 2

1

至于触发更新,UITextField有一个委托方法-textFieldDidBeginEditing:,您可以-setPrevNextButtons按照@mackworth 的建议使用它来调用。还有其他几种方法可以做类似的事情——有关更多信息,请参阅相关的委托协议

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

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

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

于 2012-05-01T22:44:46.740 回答
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]  ];
}
于 2012-05-01T22:29:13.877 回答