Swift 3:回到最后一个ViewController发送数据

时间:2017-08-04 08:55:13

标签: ios swift uiviewcontroller poptoviewcontroller

我正在尝试使用发送数据返回到我的las 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)
}

4 个答案:

答案 0 :(得分:1)

要将数据从Child传递到父控制器,您必须使用委托模式传递数据。

实现委托模式的步骤,假设A是父viewController,B是Child viewController。

  1. 创建协议,并在B

  2. 中创建委托变量
  3. 在A

  4. 中扩展协议
  5. 在Push或Present viewcontroller

  6. 时传递对A的B的引用
  7. 在A中定义委托方法,接收行动。

  8. 之后,根据您的情况,您可以从B调用委托方法。

答案 1 :(得分:0)

您应该使用delegate protocol

执行此操作
class MyClass: NSUserNotificationCenterDelegate

实施将如下:

func userDidSomeAction() {
    //implementation
}

当然,您必须在父类中实现delegete,如

childView.delegate = self

检查以获取更多信息 https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Protocols.html

答案 2 :(得分:0)

您必须使用2个选项发送回最后一个ViewController。

1.放松segue。 (使用故事板)
您可以参考this link.

2.委托/协议的使用。
您可以参考this link.

此外this link对您也很有用。

答案 3 :(得分: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()