1

我正在尝试通过发送数据返回我的 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

4 回答 4

1

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

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

  1. 创建协议,并在 B 中创建委托变量

  2. 在 A 中扩展协议

  3. 推送或呈现视图控制器时传递对 A 的 B 的引用

  4. 在A中定义委托方法,接收动作。

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

于 2017-08-04T08:57:14.110 回答
0

你应该使用delegate protocol

class MyClass: NSUserNotificationCenterDelegate

实现将如下所示:

func userDidSomeAction() {
    //implementation
}

当然,你必须在你的父类中实现deletete,比如

childView.delegate = self

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

于 2017-08-04T09:01:54.690 回答
0

您可以使用协调器模式

例如,我有 2 个屏幕。第一个显示有关用户的信息,然后从那里转到屏幕以选择他的城市。有关更改城市的信息应显示在第一个屏幕上。

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

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

用户编辑视图控制器:

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()
于 2017-08-04T09:05:05.117 回答
0

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

1. 放松赛格。(使用故事板)
您可以参考此链接。

2. 委托/协议的使用。
你可以参考这个链接。

链接也将对您有用。

于 2017-08-04T09:03:12.077 回答