ios - 如何启用/禁用 UITextField 的 inputAccessoryView 按钮?
<p><p>我创建了一个 UIToolBar 作为 inputAccessoryView,其中包含一个下一个和上一个按钮,这些按钮将在我的 ViewController 中的 textFields 中循环。</p>
<p>我在 UITextField 上创建了一个基于 <a href="https://stackoverflow.com/questions/1347779/how-to-navigate-through-textfields-next-done-buttons" rel="noreferrer noopener nofollow">third SO answer on this page</a> 的类别。它将一个属性添加到指向下一个/上一个 textField 的 textField。</p>
<p>我可以让它在文本字段中向前和向后循环,但只能循环一次,然后我的按钮将被永久禁用。此外,当最后一个 textField 处于焦点时,我仍然需要再点击一次下一个按钮(3 个 textFields 的 4 次点击)以禁用下一个按钮 - 与上一个按钮相同,我必须点击一次后我'm 在第一个文本字段中。 </p>
<pre><code>// ViewController.h
@interface DetailViewController : UIViewController <UINavigationControllerDelegate, UIImagePickerControllerDelegate, UITextFieldDelegate, UIPopoverControllerDelegate> {
__weak IBOutlet UITextField *valueField;
__weak IBOutlet UITextField *nameField;
__weak IBOutlet UITextField *serialNumberField;
}
@property (nonatomic, strong) UITextField *currentTextField;
- (IBAction)nextTextField:(id)sender;
- (IBAction)prevTextField:(id)sender;
// ViewController.m
- (void)viewDidLoad {
//...
nameField.delegate = self;
nameField.nextTextField = serialNumberField;
nameField.prevTextField = nil;
serialNumberField.delegate = self;
serialNumberField.nextTextField = valueField;
serialNumberField.prevTextField = nameField;
valueField.delegate = self;
valueField.prevTextField = serialNumberField;
valueField.nextTextField = nil;
//...
}
- (void)viewWillAppear:(BOOL)animated {
//UIToolBar for inputAccessoryView
UIToolbar *toolBar = [ initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, 50)];
UIBarButtonItem *nextField = [ initWithTitle:@"\U00003009"
style:UIBarButtonItemStylePlain
target:self
action:@selector(nextTextField:)];
UIBarButtonItem *prevField = [ initWithTitle:@"\U00003008"
style:UIBarButtonItemStylePlain
target:self
action:@selector(prevTextField:)];
UIBarButtonItem *space = [ initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil];
UIBarButtonItem *done = [ initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(backgroundTapped:)];
NSArray *toolBarButtons = @;
toolBar.items = toolBarButtons;
nameField.inputAccessoryView= toolBar;
valueField.inputAccessoryView = toolBar;
serialNumberField.inputAccessoryView = toolBar;
}
- (IBAction)nextTextField:(id)sender {
UITextField *next = self.currentTextField.nextTextField;
if (!next) {
;
} else {
;
;
}
}
- (IBAction)prevTextField:(id)sender {
UITextField *prev = self.currentTextField.prevTextField;
if (!prev) {
;
} else {
;
;
}
}
</code></pre></p>
<br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
<p><p>我认为部分问题在于您正在处理启用/禁用栏按钮的方法,该方法仅在点击其中一个栏按钮后调用。最好将 barbuttonitems 设置为 ViewController 的属性(以便您可以在需要时启用/禁用它们),然后在 UITextField 的“textFieldShouldBeginEditing”委托(delegate)方法中处理栏按钮项的启用/禁用。</p>
<p>所以,是这样的:</p>
<pre><code>- (void)viewWillAppear:(BOOL)animated {
//UIToolBar for inputAccessoryView
UIToolbar *toolBar = [ initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, 50)];
self.moveToNextFieldButton = [ initWithTitle:@"\U00003009"
style:UIBarButtonItemStylePlain
target:self
action:@selector(nextTextField:)];
self.moveToPrevFieldButton = [ initWithTitle:@"\U00003008"
style:UIBarButtonItemStylePlain
target:self
action:@selector(prevTextField:)];
UIBarButtonItem *space = [ initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil];
UIBarButtonItem *done = [ initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(backgroundTapped:)];
NSArray *toolBarButtons = @;
toolBar.items = toolBarButtons;
nameField.inputAccessoryView= toolBar;
valueField.inputAccessoryView = toolBar;
serialNumberField.inputAccessoryView = toolBar;
}
-(BOOL)textFieldShouldBeginEditing:(UITextField*)textField{
UITextField *next = textField.nextTextField;
UITextField *prev = textField.prevTextField;
self.moveToNextFieldButton.enabled = next != nil;
self.moveToPrevFieldButton.enabled = prev != nil;
return YES;
}
- (IBAction)nextTextField:(id)sender {
UITextField *next = self.currentTextField.nextTextField;
if (next) {
;
}
}
- (IBAction)prevTextField:(id)sender {
UITextField *prev = self.currentTextField.prevTextField;
if (prev) {
;
}
}
</code></pre></p>
<p style="font-size: 20px;">关于ios - 如何启用/禁用 UITextField 的 inputAccessoryView 按钮?,我们在Stack Overflow上找到一个类似的问题:
<a href="https://stackoverflow.com/questions/20643827/" rel="noreferrer noopener nofollow" style="color: red;">
https://stackoverflow.com/questions/20643827/
</a>
</p>
页:
[1]