2017-08-04 74 views
1

我想回发到我的las viewController发送数据,但它不起作用。Swift 3:回到上次ViewController发送数据

当我只是用popViewController,我可以回去的页面,但我不能从b移动我的DATAS至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是父视图控制器,B是子视图控制器。

  1. 创建协议,并且在乙

  2. 创建委托变量所述的

  3. 通参考扩展协议A和B当推或存在的ViewController

  4. 定义委托方法在A,接受行动。

  5. 之后,根据你的情况,你可以调用的委托方法从B.

0

你必须发回最后的ViewController有2个选项。

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() 
相关问题