从一个视图控制器到另一个视图控制器进行委托调用
我在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)
}
}
当用户从第2个(设置)返回到第1个视图控制器(主页)时,我没有收到呼叫。我可以用不同的方式传递数据,但我想知道我在做这件事情时做错了什么。
谢谢。
你需要重写prepareForSegue
在第一个视图控制器传递1视图 - 控制裁判secondviewcontroller委托财产。
override func prepareForSegue(segue: UIStoryboardSegue?, sender: AnyObject?) {
let viewController = segue.destinationViewController as! SettingsViewController
viewController.delegate = self
}
在HomeViewController
viewDidLoad
代码,因为你从故事板进行赛格瑞没有任何意义。
修订
@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.delegate = self
view.selectedRow = lineSelection
self.navigationController?.pushViewController(view, animated: true)
}
,您可以直接拿到SettingViewController裁判。刚刚成立的ViewController故事板ID得到它这样
let storyboard = UIStoryboard(name: "Settings", bundle: nil)
let controller = storyboard.instantiateViewControllerWithIdentifier("InitialController") as! UINavigationController
let controller = storyboard.instantiateViewController(withIdentifier: "SettingsViewController") as! SettingsViewController
我没有使用segue从第一个视图控制器转换到第二个。 –
那么你将如何从第一个控制器提交第二个视图控制器? – Sahil
我更新了代码。请参阅@IBAction func rightTapped(发件人:AnyObject) –
变化SettingsViewController类follwing方法: -
override func viewDidLoad() {
rightButton = UIBarButtonItem(title: "Back", style: .Plain, target: self, action: #selector(changeNumber))
self.navigationItem.leftBarButtonItem = rightButton
}
我为什么要这么做? –
因为您没有为后退按钮调用“changeNumber”方法。您正在为右按钮调用“changeNumber”方法,而不是后退按钮。 –
尝试这种方式,在这里我创建了一个变量settingsViewController,当用户点击右侧的按钮,我将它设置在viewDidLoad()
方法,并用它,而不是创建一个新的settingsViewController。
// 1st view controller //
class HomeViewController: UIViewController, SettingsViewControllerDelegate {
var settingsViewController: SettingsViewController?
// creating a variable so that we can use it in the IBOutlet
// method after setting it in the viewDidLoad() method
@IBAction func rightTapped(sender: AnyObject) {
settingsViewController.selectedRow = lineSelection
self.navigationController?.pushViewController(settingsViewController, animated: true)
}
override func viewDidLoad() {
super.viewDidLoad()
let storyboard = UIStoryboard(name: "Settings", bundle: nil)
let controller = storyboard.instantiateViewControllerWithIdentifier("InitialController") as! UINavigationController
settingsViewController = controller.topViewController as? SettingsViewController
settingsViewController.delegate = self
}
func didChangeLine(number: Int) {
print(number)
}
}
我没有看到这样做的目的。此外,应用程序在从第一个视图控制器转换到第二个视图控制器时会崩溃。 –
什么是崩溃消息? –
@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)
}
更改为:
@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
view.delegate = self
self.navigationController?.pushViewController(view, animated: true)
}
是否确定要更改选定的行值?如果是这样,你能展示更多的代码吗? –
@ J. Koush我可以设置一个神奇的数字didChangeLine。第一个视图控制器永远不会收到它。 –
是的。用户将被发送回第一个视图控制器。 –