2016-09-05 11 views
0

2つのViewController、FirstViewControllerおよびSecondViewControllerがあります。どちらもSwiftファイルFirstViewController.swiftSecondViewController.swiftを持っています。他のViewControllerから関数を呼び出す

FirstViewController.swiftは含まれています

class FirstViewController: UIViewController { 
    @IBAction func callFunctionInOtherClass(sender: AnyObject) { 
//  Call "func showAlert" in SecondViewController when clicking the UIButton in FirstViewController 
    } 
} 

SecondViewController.swiftは含まれています

class SecondViewController: UIViewController { 

    @IBOutlet weak var textField: UITextField! 

    func showAlert(sender: AnyObject) { 
     let alert = UIAlertView(title: "Working!", message: "This function was called from FirstViewController!\nTextField says: \(textField.text!)", delegate: nil, cancelButtonTitle: "Okay") 
     alert.show() 
    } 
} 

を私はFirstViewControllerUIButtonにテーピングする際SecondViewControllerfunc showAlert()を呼び出すことができるようにしたいです。

私はすでに多くの夜を過ごして解決策を見いだしていますが、うまくいきません。誰もこの目標に達するために何をすべきか知っていますか?

私はここのサンプルXcodeプロジェクトをアップロード:

CallFuntionInOtherClassX | filedropper.com

PS:もちろん、私はいくつかのコードを投稿し、私が何を得るのエラーを説明し、私は私が実際にどのように知っていないので、それは合理的ではないと思うことができそれを行う。

+0

は、なぜあなたはこれが必要なのですか?これは正確な使用例ですか(アラートを表示していますか)。そうでない場合、実際のユースケースは何ですか? – Losiowaty

+0

secondviewcontrollerを割り当てないfirstviewcontrollerからどのようにshowAlert()メソッドを呼び出せますか? – Poles

+0

リカバリまたは通知 –

答えて

5

を使用してこの作業を行うことができます。

override func viewDidLoad() { 
    NotificationCenter.default.addObserver(self, selector: #selector(showAlert), name: NSNotification.Name(rawValue: "callForAlert"), object: nil) 
} 

FirstViewControllerのボタンアクションメソッドでは、あなたが書き込むことによって、通知を起動する必要があります - - :

@IBAction func callFunctionInOtherClass(sender: AnyObject) { 
    //Call "func showAlert" in SecondViewController when clicking the UIButton in FirstViewController 
    NotificationCenter.default.post(name: NSNotification.Name(rawValue: "callForAlert"), object: nil) 
} 
通知放送を受信するためにオブザーバーとしてご SecondViewControllerクラスレジスタ自己の viewDidLoad方法で

removeObserverをSecondViewControllerのviewDidUnloadメソッドで呼び出すことを忘れないでください。SecondViewControllerで

override function viewDidLoad(){ 
NotificationCenter.default.addObserver(self, selector: #selector(showAlert), name: NSNotification.Name(rawValue: "showAlert"), object: nil) 
} 

コードFirstViewController

+0

ありがとう、それは動作し、時間を節約しました。しかし、まだ2つの質問: ''あなたの最後の文ではどういう意味ですか?これは何をするのですか? '2.'なぜあなたはこの解決策を提案した唯一の人ですか?それはまれな方法ですか?なぜなら、それはとても簡単です。私はなぜこのアイデアを持っていないのだろうかと思います。 – David

+0

Shobhakar Tiwariは、ターゲットアクションメカニズムを実装する標準的な方法を提案しました。しかし、指定されたケースは、デリゲートが1つのオプション、つまりNotificationCentreを残して処理することはできません。リンゴのドキュメントに従って:オブザーバオブジェクトまたはaddObserver:selector:name:object:で指定されたオブジェクトの前に、このメソッド(またはremoveObserver :)を呼び出すようにしてください。通知がnil observerで呼び出されたときにアプリがクラッシュする可能性があるためです。 – iOSGeek

+0

また、メモリリークの影響もあります。 – iOSGeek

0

この試してみてください:あなたはそれに行くときfirstview controllerからsecond viewcontrollerへのアラートビューを表示したい場合はあなたのような何かを行うことができ、あなたの第2のビューコントローラで

SecondViewController().showAlert(self) 

if let text = textField?.text { 
    dispatch_async(dispatch_get_main_queue(),{ 

     let alert = UIAlertView(title: "Working!", message: "This function was called from FirstViewController!\nTextField says: \(text)", delegate: nil, cancelButtonTitle: "Okay") 
     alert.show() 

    }) 
} 
+0

「致命的なエラーが発生しました:予期せず、オプション値をアンラッピングしている間にnilが見つかりません」とクラッシュします。しかし、アラートコードを削除して 'print(" It works! ")を実行すると、クラッシュは発生せず、コンソールにプリントが表示されます。 – David

+0

'\(textField.text!)'が問題のようです。これを削除すると、 'dispatch_async'の有無にかかわらず動作します。どのようなアイデアは何ですか? – David

+0

このようにアンラップしないでください。間違っています。 – Sofeda

0

を、

self.performSegueWithIdentifier("your segue identifier", sender: self) // or whatever way if you are not using storyboard or segue 

    let alert = UIAlertView(title: "Working!", message: "This function was called from FirstViewController!", delegate: nil, cancelButtonTitle: "Okay") 
    alert.show() 

variablessecondviewcontrollerの場合、prepareForSegueメソッドを実装する必要があります。 (segueを使用している場合)。

viewDidloadにalertviewを表示することができます。secondViewControllerもあります。

+0

残念ながら、動作しません。私は 'SecondViewController'を実行してこの関数を呼び出す必要があります。なぜなら' ViewController'のために '@ IBOutlet's'が必要なのですから。 – David

1

EDIT: These functions have been revised in swift 3 as follows:

コード:

@IBAction func callFunctionInOtherClass(sender: AnyObject) { 
NotificationCenter.default.post(name: NSNotification.Name(rawValue: "showAlert"), object: nil) 
} 
関連する問題