我在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個視圖控制器(主頁)時,我沒有收到呼叫。我可以用不同的方式傳遞數據,但我想知道我在做這件事情時做錯了什麼。
謝謝。
是否確定要更改選定的行值?如果是這樣,你能展示更多的代碼嗎? –
@ J. Koush我可以設置一個神奇的數字didChangeLine。第一個視圖控制器永遠不會收到它。 –
是的。用戶將被髮送回第一個視圖控制器。 –