【发布时间】:2017-04-08 18:04:00
【问题描述】:
我在 Swift 中没有做过的一件事是使用委托。所以我试图从一个视图控制器到另一个视图控制器进行委托调用以传递数据。
我有两个跨两个独立故事板的视图控制器。一个是 HomeViewController,第一个视图控制器。这就是用户现在所处的位置。然后他点击右侧导航项按钮转到第二个视图控制器 SettingsViewController。然后他点击导航项按钮返回到第一个视图控制器。在返回的路上,SettingsViewController 向 HomeViewController 发送了一个Int 值。我所拥有的是以下内容。
// 1st view controller //
class HomeViewController: UIViewController, SettingsViewControllerDelegate {
@IBAction func rightTapped(sender: AnyObject) {
let storyboard = UIStoryboard(name: "Settings", bundle: nil)
let controller = storyboard.instantiateViewControllerWithIdentifier("InitialController") as! UINavigationController
let view = controller.topViewController as! SettingsViewController
view.selectedRow = lineSelection
self.navigationController?.pushViewController(view, animated: true)
}
override func viewDidLoad() {
let storyboard = UIStoryboard(name: "Settings", bundle: nil)
let controller = storyboard.instantiateViewControllerWithIdentifier("InitialController") as! UINavigationController
let settingsViewController = controller.topViewController as! SettingsViewController
settingsViewController.delegate = self
}
func didChangeLine(number: Int) {
print(number) // <<<<<<<<< not getting a delegate call
}
}
// 2nd view controller //
protocol SettingsViewControllerDelegate {
func didChangeLine(number: Int)
}
class SettingsViewController: UIViewController {
var selectedRow = Int() // the row selected from a table view
var rightButton = UIBarButtonItem()
override func viewDidLoad() {
rightButton = UIBarButtonItem(title: "Change", style: .Plain, target: self, action: #selector(changeNumber))
self.navigationItem.rightBarButtonItem = rightButton
}
// going back to 1st view controller (HomeViewController)
func changeNumber() {
self.delegate?.didChangeLine(selectedRow)
self.navigationController?.popViewControllerAnimated(true)
}
}
当用户从第二个(设置)返回到第一个视图控制器(主页)时,我没有接到电话。我可以用不同的方法传递数据,但我想知道我在这种情况下做错了什么。
谢谢。
【问题讨论】:
-
您确定要更改选定的行值吗?如果是这样,你能显示更多的代码吗?
-
@J. Koush 我可以为 didChangeLine 设置一个幻数。第一个视图控制器永远不会收到它。
-
是的。用户将被送回第一个视图控制器。
-
如果委托不是
nil,您能否使用changeNumber()方法中的调试器进行检查。 -
您正在 viewDidLoad 中创建 SettingsViewController 的实例并设置其委托,但您没有保存或呈现此设置视图控制器实例。你如何呈现设置视图控制器?
标签: ios swift uiviewcontroller delegates