Swift 3:回到最后一个发送数据的 ViewController [重复]

Posted

技术标签:

【中文标题】Swift 3:回到最后一个发送数据的 ViewController [重复]【英文标题】:Swift 3 : Back to last ViewController with sending data [duplicate] 【发布时间】:2017-08-04 08:55:13 【问题描述】:

我正在尝试返回我的 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)

【问题讨论】:

查看***.com/a/45215000/7113238 如果是你之前的VC,可以使用上面的代码 是否要将数据发送回根视图控制器? 【参考方案1】:

要将数据从 Child 传递到父 Controller,您必须使用 Delegate 模式传递数据。

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

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

    在 A 中扩展协议

    在 Push 或 Present 视图控制器时传递对 A 的 B 的引用

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

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

【讨论】:

【参考方案2】:

你应该使用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

【讨论】:

【参考方案3】:

您必须使用 2 个选项发送回最后一个 ViewController。 1. 放松赛格。 (使用故事板) 可以参考this link. 2.委托/协议的使用。 可以参考this link.this link 也会对你有用。

【讨论】:

【参考方案4】:

您可以使用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])
    
    ...

用户编辑视图控制器:

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()

【讨论】:

以上是关于Swift 3:回到最后一个发送数据的 ViewController [重复]的主要内容,如果未能解决你的问题,请参考以下文章

iOS Swift UIView 动画跳回到开头

Swift 3 回到之前的视图控制器

当一个 UIButton 被点击时,你如何让它变大,然后使用 Swift 3 回到以前/正常的大小?

如何在 Swift 3 的 POST 请求中发送表单数据

如何在 Swift 上从最后一个 VC 更改为中间 VC

Swift - 带有单独 searchResultsController 的 UISearchController