У меня есть функция «addDoneButton» в FirstViewController.swift, я не хочу копировать и вставлять в SecondViewController.swift, поэтому я хочу вызвать ее в SecondViewController.
func addDoneButton() {
let keyboardToolbar = UIToolbar()
keyboardToolbar.sizeToFit()
let flexBarButton = UIBarButtonItem(barButtonSystemItem: .FlexibleSpace,
target: nil, action: nil)
let doneBarButton = UIBarButtonItem(barButtonSystemItem: .Done,
target: view, action: #selector(UIView.endEditing(_:)))
keyboardToolbar.items = [flexBarButton, doneBarButton]
for textField in self.collectionOfTextField! as [UITextField] {
textField.keyboardType = .DecimalPad
textField.inputAccessoryView = keyboardToolbar
}
}
Как это реализовать? Заранее спасибо от нового свифтера.
4 ответа
Как насчет создания расширения UIViewController
и передачи collectionTextFields
в качестве аргумента?
extension UIViewController {
func addDoneButton(collectionTextFields: [UITextField]) {
let keyboardToolbar = UIToolbar()
keyboardToolbar.sizeToFit()
let flexBarButton = UIBarButtonItem(barButtonSystemItem: .FlexibleSpace,
target: nil, action: nil)
let doneBarButton = UIBarButtonItem(barButtonSystemItem: .Done,
target: view, action: #selector(UIView.endEditing(_:)))
keyboardToolbar.items = [flexBarButton, doneBarButton]
for textField in collectionTextFields {
textField.keyboardType = .DecimalPad
textField.inputAccessoryView = keyboardToolbar
}
}
}
Я думаю, что ответ EridB - хороший способ.
А как насчет расширения протокола Swift 2? Это похоже на его ответ с той лишь разницей, что не все ViewController получают доступ к методу, если вы не соответствуете протоколу.
protocol Button { }
extension Button where Self: UIViewController {
func addDoneButton(forCollectionTextFields collectionTextFields: [UITextField]) {
let keyboardToolbar = UIToolbar()
keyboardToolbar.sizeToFit()
let flexBarButton = UIBarButtonItem(barButtonSystemItem: .FlexibleSpace,
target: nil, action: nil)
let doneBarButton = UIBarButtonItem(barButtonSystemItem: .Done,
target: view, action: #selector(UIView.endEditing(_:)))
keyboardToolbar.items = [flexBarButton, doneBarButton]
for textField in collectionTextFields {
textField.keyboardType = .DecimalPad
textField.inputAccessoryView = keyboardToolbar
}
}
}
Чем в ваших viewControllers, которым необходимо вызвать этот метод, вы соответствуете протоколу и просто вызываете его.
class SomeViewController: UIViewController, Button {
override func viewDidLoad() {
super.viewDidLoad()
addDoneButton(forCollectionTextFields: self.collectionOfTextField)
}
}
Надеюсь это поможет
Просто попробуйте это в своем SecondViewController.swift:
let firstViewController = FirstViewController()
И всякий раз, когда вам понадобится функция, просто вызовите:
firstViewController.addDoneButton()
Вы можете создать протокол, а затем поместить этот метод в расширение протокола, где self: UIViewController. Затем для любого подкласса UIViewController, который вы хотите включить эту функцию, просто добавьте CanAddDoneButton к протоколам, которым он соответствует ... с оговоркой, что у него уже есть эта переменная collectionTextFields. Хотя я думаю, вы даже можете поместить эту переменную в расширение протокола, если только это не IBOutlet.
protocol CanAddDoneButton {
var collectionTextFields: [UITextField]
func addDoneButton()
}
extension CanAddDoneButton where Self: UIViewController {
func addDoneButton() { .... }
}
Похожие вопросы
Новые вопросы
ios
iOS - мобильная операционная система, работающая на Apple iPhone, iPod touch и iPad. Используйте этот тег [ios] для вопросов, связанных с программированием на платформе iOS. Используйте связанные теги [target-c] и [swift] для проблем, характерных для этих языков программирования.