2017-01-12 13 views
2

モーダルVC(FirstStartVC)をメインVCに戻してから関数をトリガしようとしています。私は委任を使用しなければならないことを知っていますが、それはうまくいかず、デバッグ領域も空のままです。モーダルビューが解除されたときのVCのトリガ機能

その他の質問トピックでは、以下のように正確に同じ方法で作業していた人がいました。だから私は何が間違っているのか分かりません。コードに変更する必要があることを誰かが知っていますか?あなたのコードで

// FirstStartVC.swift 
// 

import UIKit 
import CoreData 
import JSSAlertView 

protocol NewUser: class { 
    func newUserAction() 
} 

class FirstStartVC: UITableViewController, UITextFieldDelegate { 

    var delegation : NewUser? 

    func saveNewUser(){ 
      self.delegation?.newUserAction() 
      self.dismiss(animated: true, completion: nil) 
     } 
    } 

    @IBAction func saveSettings(_ sender: Any) { 
     self.saveNewUser() 
    } 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     print (delegation) 

    } 
} 





// 
// ViewController.swift 
// 

import UIKit 
import UserNotifications 
import GoogleMobileAds 
import CoreData 
import JSSAlertView 

class ViewController: UIViewController, UNUserNotificationCenterDelegate, NewUser { 
    func newUserAction() { 
     print("Reload some labels") 
    } 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     var firstStart = FirstStartVC() 
     firstStart.delegation = self 

    } 
} 
+0

このビューコントローラがその処理を完了したときに、「メインVC」に通知したいようです。あなたは 'メインVC'にあるコードを共有できますか? – justColbs

答えて

2

スウィフト3

NotificationCenter.default.addObserver(self, selector: #selector(mainVc.functionName), name:"NotificationID", object: nil) 

とFirstStartVCにメインVCに

func functionName() { 

    // Do stuff 

} 

を機能を追加

NotificationCenter.default.postNotificationName("NotificationID", object: nil) 
でメソッドを呼び出します

これは役に立ちます。

+0

完璧な答え! –

+0

ありがとう!Bcデリゲートは私の場合はありません! –

2

、あなたが持っている:(あなたもfinished inを言う必要はないかもしれません

func saveNewUser() { 
     self.delegation?.newUserAction() 
     self.dismiss(animated: true, completion: { finished in 
      // on completion 
     }) 
    } 
} 

func saveNewUser(){ 
     self.delegation?.newUserAction() 
     self.dismiss(animated: true, completion: nil) 
    } 
} 

は、単にあなたがcompletion:で却下した後に実行したいコードを書きますまたはそのようなもの)

0

内で実行する必要があるコードはFirstStartVCの一部ですので、dismiss(_:animated:)メソッドの完了ハンドラ内で呼び出すだけです。ただし、FirstStartVCを提示したVCでコードを実行する必要がある場合は、NewUserプロトコルに準拠していることを確認してください。あなたは(提示VCがPresentingViewControllerのようなものと命名されたと仮定すると - あなたのプロジェクトのためのケースであるものは何でもそれを変更)このような何かを行うことができます:それはに準拠してその後、画面の下部にextensionを作成

class PresentingViewController: UIViewController { 

    // However you instantiate the FirstStartVC 
    let firstStart = FirstStartVC() 

    // set the delegation property to self 
    firstStart.delegation = self 

} 

extension PresentingViewController: NewUser { 

    func newUserAction() { 

     // Here you can do whatever you want when the delegation calls this method 

    } 

} 

EDIT: - さらに勧告...

私は常にメモリの問題を防ぐためにweak参照を使用する代表者と、それのベストプラクティスを見つけます。これを行うには、完了済みのを:classと設定してください(protocol NewUser: class)。あなたがFirstStartVCの上部にプロパティを作成するときに、あなたはちょうど多くの事例ではメモリの問題を避けるために私を助けていますように私はそれをこのように行うことをお勧め、

weak var delegation: NewUser? 

あなたのコードはまだ同じことを実行しますと言うでしょう。あなたの主なVC viewDidLoadアドオンで

関連する問題