Skip to content

Instantly share code, notes, and snippets.

@vamsiac
Created October 11, 2016 13:39
Show Gist options
  • Save vamsiac/8bf8caffb998bc6b8aa94b1692757827 to your computer and use it in GitHub Desktop.
Save vamsiac/8bf8caffb998bc6b8aa94b1692757827 to your computer and use it in GitHub Desktop.
import UIKit
protocol CustomAccessoryToolbarDelegate {
var userEnabledFields: [UIView]! {get set}
func previousButtonClicked(_ sender: UIView)
func nextButtonClicked(_ sender: UIView)
func doneButtonClicked(_ sender: UIView)
}
extension CustomAccessoryToolbarDelegate where Self: UIViewController {
func previousButtonClicked(_ sender: UIView) {
if let index = self.userEnabledFields?.index(of: sender), index - 1 >= 0 {
let nextView = self.userEnabledFields[index - 1]
nextView.becomeFirstResponder()
} else {
self.view.endEditing(true)
}
}
func nextButtonClicked(_ sender: UIView) {
if let index = self.userEnabledFields?.index(of: sender), index + 1 < self.userEnabledFields.count {
let nextView = self.userEnabledFields[index + 1]
nextView.becomeFirstResponder()
} else {
self.view.endEditing(true)
}
}
func doneButtonClicked(_ sender: UIView) {
self.view.endEditing(true)
}
}
class CustomAccessoryToolbar: UIToolbar {
var toolbarDelegate: CustomAccessoryToolbarDelegate?
var currentlySelectedTextboxIndex: UIView!
convenience init(delegate: CustomAccessoryToolbarDelegate) {
self.init()
self.toolbarDelegate = delegate
NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow), name: NSNotification.Name.UITextFieldTextDidBeginEditing, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow), name: NSNotification.Name.UITextViewTextDidBeginEditing, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillHide), name: NSNotification.Name.UITextViewTextDidEndEditing, object: nil)
NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillHide), name: NSNotification.Name.UIKeyboardWillHide, object: nil)
configureToolbar()
}
override init(frame: CGRect) {
super.init(frame: frame)
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}
func keyboardWillShow(_ sender: Notification) {
if let userInfo = sender.object as? UITextField {
self.currentlySelectedTextboxIndex = userInfo
}
if let userInfo = sender.object as? UITextView {
self.currentlySelectedTextboxIndex = userInfo
}
}
func keyboardWillHide(_ sender: Notification) {
NotificationCenter.default.removeObserver(self, name:NSNotification.Name.UITextFieldTextDidBeginEditing, object: nil)
NotificationCenter.default.removeObserver(self, name:NSNotification.Name.UITextViewTextDidBeginEditing, object: nil)
NotificationCenter.default.removeObserver(self, name:NSNotification.Name.UIKeyboardWillHide, object: nil)
}
func configureToolbar() {
self.barStyle = UIBarStyle.black
self.tintColor = UIColor.applicationYellowColor()
self.isTranslucent = true
self.sizeToFit()
let barSegment = self.getNextPrevButtons()
let doneButton = self.getDoneButton()
let flexibleSpace = UIBarButtonItem(barButtonSystemItem: .flexibleSpace, target: nil, action: nil)
self.setItems([barSegment, flexibleSpace, doneButton], animated: true)
}
fileprivate func getNextPrevButtons() -> UIBarButtonItem {
let segmentControl = UISegmentedControl(items: ["Previous", "Next"])
segmentControl.addTarget(self, action: #selector(segmentClicked(_:)), for: .valueChanged)
segmentControl.isMomentary = true
return UIBarButtonItem(customView: segmentControl)
}
fileprivate func getDoneButton() -> UIBarButtonItem {
return UIBarButtonItem(barButtonSystemItem: .done, target: self, action: #selector(userClickedDone(_:)))
}
func userClickedDone(_ sender: AnyObject?) {
self.toolbarDelegate?.doneButtonClicked(self.currentlySelectedTextboxIndex)
}
func segmentClicked(_ sender: AnyObject?) {
_ = sender?.resignFirstResponder()
if let selectedIndex = sender?.selectedSegmentIndex {
switch selectedIndex {
case 0:
self.toolbarDelegate?.previousButtonClicked(self.currentlySelectedTextboxIndex)
break
case 1:
self.toolbarDelegate?.nextButtonClicked(self.currentlySelectedTextboxIndex)
break
default: break
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment