工具栏的键盘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
Next
button在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'
它将两个延迟加载的属性nextTextField
和previousTextField
到任何UITextField。 您只需要在界面构build器上或以编程方式指定nextTextField
,并将工具栏添加到键盘中。
编程方式:
import UITextField_Navigation let textField1 = UITextField() let textField2 = UITextField() textField1.nextTextField = textField2 assert(textField2 == textField1.nextTextField) assert(textField1 == textField2.previousTextField)
在界面生成器上:
尝试这个 :-
- (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的名称。