2017-08-04 7 views
1

私はデータを送信しながら私のlas viewControllerに戻そうとしていますが、動作しません。スイフト3:データを送信する最後のViewControllerに戻る

私はちょうどpopViewControllerを使用する場合、私は戻っページに行くことができますが、私はここではBからAへ

を私の件のデータを移動することはできませんが、私のコードです:

func goToLastViewController() { 
    let vc = self.navigationController?.viewControllers[4] as! OnaylarimTableViewController 
    vc.onayCode.userId = taskInfo.userId 
    vc.onayCode.systemCode = taskInfo.systemCode 

    self.navigationController?.popToViewController(vc, animated: true) 
} 
+0

https://stackoverflow.com/これをチェックしてくださいa/45215000/7113238 – Lawliet

+0

以前のVCの場合は、上記のコード –

+0

を使用して、ルートビューコントローラにデータを送り返しますか? – iDhaval

答えて

1

データを渡すには子から親のコントローラーに、代理人パターンを使用してデータを渡す必要があります。

委任パターンを実装する手順は、Aが親viewControllerで、Bが子viewControllerであるとします。

  1. プッシュまたは現在のViewControllerが

  2. がでデリゲートメソッドを定義AのBに

  3. パス参照してプロトコルを拡張プロトコルを作成し、B

  4. にデリゲート変数を作成A、アクションを受け取ります。その後

  5. 、あなたの条件によると、あなたはあなたが、実装は次のようになりますdelegate protocol

    class MyClass: NSUserNotificationCenterDelegate 
    

    を使用して、それを行う必要がありますB.

0

のためにあなたは2つのオプションでバック最後のViewControllerに送信する必要があり

childView.delegate = self 

チェックのようなクラス。

1.セグを巻き戻す。 (ストーリーボードを使用して)
this link.

2.デリゲート/プロトコルの使用。
参照できますthis link.

this linkはお役に立ちます。

0

あなたが例えばCoordinator Pattern

を使用することができ、私は2つの画面を持っています。最初のユーザーはユーザーに関する情報を表示し、そこから彼は自分の都市を選択するための画面に進みます。変更された都市に関する情報が最初の画面に表示されます。

final class CitiesViewController: UITableViewController { 
    // MARK: - Output - 
    var onCitySelected: ((City) -> Void)? 

    override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 
     onCitySelected?(cities[indexPath.row]) 
    } 
    ... 
} 

UserEditViewController:

final class UserEditViewController: UIViewController, UpdateableWithUser { 
    // MARK: - Input - 
    var user: User? { didSet { updateView() } } 

    @IBOutlet private weak var userLabel: UILabel? 

    private func updateView() { 
     userLabel?.text = "User: \(user?.name ?? ""), \n" 
         + "City: \(user?.city?.name ?? "")" 
    } 
} 

そしてコーディネーター:

protocol UpdateableWithUser: class { 
    var user: User? { get set } 
} 

final class UserEditCoordinator { 

    // MARK: - Properties 
    private var user: User { didSet { updateInterfaces() } } 
    private weak var navigationController: UINavigationController? 

    // MARK: - Init 
    init(user: User, navigationController: UINavigationController) { 
     self.user = user 
     self.navigationController = navigationController 
    } 

    func start() { 
     showUserEditScreen() 
    } 

    // MARK: - Private implementation 
    private func showUserEditScreen() { 
     let controller = UIStoryboard.makeUserEditController() 
     controller.user = user 
     controller.onSelectCity = { [weak self] in 
      self?.showCitiesScreen() 
     } 
     navigationController?.pushViewController(controller, animated: false) 
    } 

    private func showCitiesScreen() { 
     let controller = UIStoryboard.makeCitiesController() 
     controller.onCitySelected = { [weak self] city in 
      self?.user.city = city 
      _ = self?.navigationController?.popViewController(animated: true) 
     } 
     navigationController?.pushViewController(controller, animated: true) 
    } 

    private func updateInterfaces() { 
     navigationController?.viewControllers.forEach { 
      ($0 as? UpdateableWithUser)?.user = user 
     } 
    } 
} 

その後、我々はちょうどコーディネーターを開始する必要があります。

coordinator = UserEditCoordinator(user: user, navigationController: navigationController) 
coordinator.start() 
関連する問題