У меня есть функция «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

    }
}

Как это реализовать? Заранее спасибо от нового свифтера.

1
user6702783 7 Сен 2016 в 05:25

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
        }
    }
}
1
E-Riddie 7 Сен 2016 в 02:42

Я думаю, что ответ 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)
    }
  }

Надеюсь это поможет

0
crashoverride777 7 Сен 2016 в 14:30

Просто попробуйте это в своем SecondViewController.swift:

let firstViewController = FirstViewController()

И всякий раз, когда вам понадобится функция, просто вызовите:

firstViewController.addDoneButton()
-1
Hung Nguyen 7 Сен 2016 в 02:48

Вы можете создать протокол, а затем поместить этот метод в расширение протокола, где self: UIViewController. Затем для любого подкласса UIViewController, который вы хотите включить эту функцию, просто добавьте CanAddDoneButton к протоколам, которым он соответствует ... с оговоркой, что у него уже есть эта переменная collectionTextFields. Хотя я думаю, вы даже можете поместить эту переменную в расширение протокола, если только это не IBOutlet.

protocol CanAddDoneButton {
    var collectionTextFields: [UITextField]
    func addDoneButton()
}

extension CanAddDoneButton where Self: UIViewController {
   func addDoneButton() { .... }
}
1
twiz_ 7 Сен 2016 в 05:16