工具栏的键盘inputAccessoryView“上一页”和“下一页”

我一直试图实现这个工具栏,其中只有“下一步”button被启用,当顶部textField是firstResponder,并且当底部textField是firstResponder时只有'Previous'button被启用。

这种工作方式,但发生的事情是我需要每次点击两次“上一页”/“下一页”button来启用/禁用反向button。

我是否在响应者链中错过了一些正在发生的事情?

这是我的代码:

- (void)viewDidLoad { [super viewDidLoad]; [self.topText becomeFirstResponder]; } - (UIToolbar *)keyboardToolBar { UIToolbar *toolbar = [[UIToolbar alloc] init]; [toolbar setBarStyle:UIBarStyleBlackTranslucent]; [toolbar sizeToFit]; UISegmentedControl *segControl = [[UISegmentedControl alloc] initWithItems:@[@"Previous", @"Next"]]; [segControl setSegmentedControlStyle:UISegmentedControlStyleBar]; segControl.momentary = YES; segControl.highlighted = YES; [segControl addTarget:self action:@selector(changeRow:) forControlEvents:(UIControlEventValueChanged)]; [segControl setEnabled:NO forSegmentAtIndex:0]; UIBarButtonItem *nextButton = [[UIBarButtonItem alloc] initWithCustomView:segControl]; NSArray *itemsArray = @[nextButton]; [toolbar setItems:itemsArray]; return toolbar; } - (void)changeRow:(id)sender { int idx = [sender selectedSegmentIndex]; if (idx == 1) { [sender setEnabled:NO forSegmentAtIndex:1]; [sender setEnabled:YES forSegmentAtIndex:0]; self.topText.text = @"Top one"; [self.bottomText becomeFirstResponder]; } else { [sender setEnabled:NO forSegmentAtIndex:0]; [sender setEnabled:YES forSegmentAtIndex:1]; self.bottomText.text =@"Bottom one"; [self.topText becomeFirstResponder]; } } -(void)textFieldDidBeginEditing:(UITextField *)textField { if (!textField.inputAccessoryView) { textField.inputAccessoryView = [self keyboardToolBar]; } } 

迅速:

 lazy var inputToolbar: UIToolbar = { var toolbar = UIToolbar() toolbar.barStyle = .default toolbar.translucent = true toolbar.sizeToFit() var doneButton = UIBarButtonItem(title: "Done", style: .bordered, target: self, action: "inputToolbarDonePressed") var flexibleSpaceButton = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil) var fixedSpaceButton = UIBarButtonItem(barButtonSystemItem: .fixedSpace, target: nil, action: nil) var nextButton = UIBarButtonItem(image: UIImage(named: "keyboardPreviousButton"), style: .bordered, target: self, action: "keyboardNextButton") nextButton.width = 50.0 var previousButton = UIBarButtonItem(image: UIImage(named: "keyboardNextButton"), style: .Bordered, target: self, action: "keyboardPreviousButton") toolbar.setItems([fixedSpaceButton, nextButton, fixedSpaceButton, previousButton, flexibleSpaceButton, doneButton], animated: false) toolbar.userInteractionEnabled = true return toolbar }() 

在UITextFieldDelegate

  func textFieldShouldBeginEditing(textField: UITextField) -> Bool { textField.inputAccessoryView = inputToolbar return true } 

好的,在看了BSKeyboardControls之后 ,我尝试在textFieldDidBeginEditing中实现分段控件的启用和禁用,而不是在我的@selector所在的位置。 我还介绍了一个分段控制的variables。 它现在有效。 以下是修改后的代码片段:

 - (void)viewDidLoad { [super viewDidLoad]; [self.topText becomeFirstResponder]; } - (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; } - (UIToolbar *)keyboardToolBar { UIToolbar *toolbar = [[UIToolbar alloc] init]; [toolbar setBarStyle:UIBarStyleBlackTranslucent]; [toolbar sizeToFit]; self.segControl = [[UISegmentedControl alloc] initWithItems:@[@"Previous", @"Next"]]; [self.segControl setSegmentedControlStyle:UISegmentedControlStyleBar]; self.segControl.momentary = YES; [self.segControl addTarget:self action:@selector(changeRow:) forControlEvents:(UIControlEventValueChanged)]; [self.segControl setEnabled:NO forSegmentAtIndex:0]; UIBarButtonItem *nextButton = [[UIBarButtonItem alloc] initWithCustomView:self.segControl]; NSArray *itemsArray = @[nextButton]; [toolbar setItems:itemsArray]; return toolbar; } - (void)changeRow:(id)sender { int idx = [sender selectedSegmentIndex]; if (idx) { self.topText.text = @"Top one"; [self.bottomText becomeFirstResponder]; } else { self.bottomText.text =@"Bottom one"; [self.topText becomeFirstResponder]; } } -(void)textFieldDidBeginEditing:(UITextField *)textField { if (!textField.inputAccessoryView) { textField.inputAccessoryView = [self keyboardToolBar]; } if (textField.tag) { [self.segControl setEnabled:NO forSegmentAtIndex:1]; [self.segControl setEnabled:YES forSegmentAtIndex:0]; } } 

我的build议是“不要重新发明轮子”。

通过键盘上的“上Prev和“ Next Prev Nextbutton在UITextView之间进行切换非常常见,您可以find许多准备好的实现。

看看BSKeyboardControl ,例如。

这里有一个UIViewController扩展,我需要使用一组UITextField来提供通过input附件的导航。 没有必要使用这种方法使用UITextField委托,并将行为添加到多个表单,但是是单行的。 还支持“完成”button来解散。

 extension UIViewController { func addInputAccessoryForTextFields(textFields: [UITextField], dismissable: Bool = true, previousNextable: Bool = false) { for (index, textField) in textFields.enumerate() { let toolbar: UIToolbar = UIToolbar() toolbar.sizeToFit() var items = [UIBarButtonItem]() if previousNextable { let previousButton = UIBarButtonItem(image: UIImage(named: "Backward Arrow"), style: .Plain, target: nil, action: nil) previousButton.width = 30 if textField == textFields.first { previousButton.enabled = false } else { previousButton.target = textFields[index - 1] previousButton.action = #selector(UITextField.becomeFirstResponder) } let nextButton = UIBarButtonItem(image: UIImage(named: "Forward Arrow"), style: .Plain, target: nil, action: nil) nextButton.width = 30 if textField == textFields.last { nextButton.enabled = false } else { nextButton.target = textFields[index + 1] nextButton.action = #selector(UITextField.becomeFirstResponder) } items.appendContentsOf([previousButton, nextButton]) } let spacer = UIBarButtonItem(barButtonSystemItem: .FlexibleSpace, target: nil, action: nil) let doneButton = UIBarButtonItem(barButtonSystemItem: .Done, target: view, action: #selector(UIView.endEditing)) items.appendContentsOf([spacer, doneButton]) toolbar.setItems(items, animated: false) textField.inputAccessoryView = toolbar } } } 

例:

 let field1 = UITextField() let field2 = UITextField() addInputAccessoryForTextFields([field1, field2], dismissable: true, previousNextable: true) 

这是一个合理的箭头图标 。

您也可以尝试pod UITextField-Navigation :

pod 'UITextField-Navigation'

它将两个延迟加载的属性nextTextFieldpreviousTextField到任何UITextField。 您只需要在界面构build器上或以编程方式指定nextTextField ,并将工具栏添加到键盘中。

编程方式:

 import UITextField_Navigation let textField1 = UITextField() let textField2 = UITextField() textField1.nextTextField = textField2 assert(textField2 == textField1.nextTextField) assert(textField1 == textField2.previousTextField) 

在界面生成器上:

在Interface Builder中连接nextTextField 在这里输入图像说明

尝试这个 :-

 - (void)viewDidLoad { [super viewDidLoad]; [self.topText becomeFirstResponder]; } - (UIToolbar *)keyboardToolBar { UIToolbar *toolbar = [[UIToolbar alloc] init]; [toolbar setBarStyle:UIBarStyleBlackTranslucent]; [toolbar sizeToFit]; UISegmentedControl *segControl = [[UISegmentedControl alloc] initWithItems:@[@"Previous", @"Next"]]; [segControl setSegmentedControlStyle:UISegmentedControlStyleBar]; segControl.momentary = YES; segControl.highlighted = YES; [segControl addTarget:self action:@selector(changeRow:) forControlEvents:(UIControlEventValueChanged)]; [segControl setEnabled:NO forSegmentAtIndex:0]; UIBarButtonItem *nextButton = [[UIBarButtonItem alloc] initWithCustomView:segControl]; NSArray *itemsArray = @[nextButton]; [toolbar setItems:itemsArray]; int idx = [sender selectedSegmentIndex]; if (idx == 1) { [sender setEnabled:NO forSegmentAtIndex:1]; } else { [sender setEnabled:NO forSegmentAtIndex:0]; } return toolbar; } - (void)changeRow:(id)sender { int idx = [sender selectedSegmentIndex]; if (idx == 1) { self.topText.text = @"Top one"; [self.bottomText becomeFirstResponder]; } else { self.bottomText.text =@"Bottom one"; [self.topText becomeFirstResponder]; } } -(void)textFieldDidBeginEditing:(UITextField *)textField { if (!textField.inputAccessoryView) { textField.inputAccessoryView = [self keyboardToolBar]; } } 

你不需要启用其他项目,因为他们每次键盘更改时重新初始化….

更新了Swift 3.0

 lazy var inputToolbar: UIToolbar = { var toolbar = UIToolbar() toolbar.barStyle = .default toolbar.isTranslucent = true toolbar.sizeToFit() var doneButton = UIBarButtonItem(title: "Done", style: .plain, target: self, action: #selector(ContactViewController.inputToolbarDonePressed)) var flexibleSpaceButton = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil) var fixedSpaceButton = UIBarButtonItem(barButtonSystemItem: .fixedSpace, target: nil, action: nil) var nextButton = UIBarButtonItem(title: "Next", style: .plain, target: self, action: #selector(ContactViewController.keyboardNextButton)) var previousButton = UIBarButtonItem(title: "Previous", style: .plain, target: self, action: #selector(ContactViewController.keyboardPreviousButton)) toolbar.setItems([fixedSpaceButton, previousButton, fixedSpaceButton, nextButton, flexibleSpaceButton, doneButton], animated: false) toolbar.isUserInteractionEnabled = true return toolbar }() 

接着:

 func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool { textField.inputAccessoryView = inputToolbar return true } 

请记住将“ContactViewController”更改为View Controller的名称。