2016-09-07 15 views
1

FirstViewController.swiftに "addDoneButton"という関数があります。SecondViewController.swiftにコピーして貼り付けたくないので、SecondViewControllerで呼び出す必要があります。Swift:別のViewControllerからViewController funcを呼び出してください。

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 

    } 
} 

これを実現する方法は?新しいswifterから事前に感謝します。

答えて

1

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

ちょうどあなたのSecondViewController.swiftでこれを試してみてください。

let firstViewController = FirstViewController() 

そして、あなたが機能を必要とするすべての回だけ呼び出す:

firstViewController.addDoneButton() 
+0

Tthatsを助け、正しい方法ではありません。 – crashoverride777

1

をあなたは、プロトコルを作ることができ、このメソッドを置きますプロトコル拡張でself:UIViewControllerを呼び出します。次に、この関数を有効にするUIViewControllerサブクラスは、それに準拠するプロトコルにCanAddDoneButtonを追加するだけです。既にそのcollectionTextFields変数があることに注意してください。私はあなたがIBOutletでない限り、その変数をプロトコル拡張に入れることもできると思いますが。

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

extension CanAddDoneButton where Self: UIViewController { 
    func addDoneButton() { .... } 
} 
0

私は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 

     } 
    } 

} 

このメソッドを呼び出す必要があるviewControllerでは、プロトコルに準拠しているだけで呼び出します。

class SomeViewController: UIViewController, Button { 

    override func viewDidLoad() { 
    super.viewDidLoad() 

     addDoneButton(forCollectionTextFields: self.collectionOfTextField) 
    } 
    } 

希望これはFirstViewControllerの新しいインスタンスを作成

関連する問題