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 [重复]的主要内容,如果未能解决你的问题,请参考以下文章