我正在尝试使用发送数据返回到我的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)
}
答案 0 :(得分:1)
要将数据从Child传递到父控制器,您必须使用委托模式传递数据。
实现委托模式的步骤,假设A是父viewController,B是Child viewController。
创建协议,并在B
在A
在Push或Present viewcontroller
在A中定义委托方法,接收行动。
之后,根据您的情况,您可以从B调用委托方法。
答案 1 :(得分:0)
您应该使用delegate protocol
class MyClass: NSUserNotificationCenterDelegate
实施将如下:
func userDidSomeAction() {
//implementation
}
当然,您必须在父类中实现delegete,如
childView.delegate = self
答案 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()