2016-11-24 89 views
-1

我在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個視圖控制器(主頁)時,我沒有收到呼叫。我可以用不同的方式傳遞數據,但我想知道我在做這件事情時做錯了什麼。

謝謝。

+0

是否確定要更改選定的行值?如果是這樣,你能展示更多的代碼嗎? –

+0

@ J. Koush我可以設置一個神奇的數字didChangeLine。第一個視圖控制器永遠不會收到它。 –

+0

是的。用戶將被髮送回第一個視圖控制器。 –

回答

1

你需要重寫prepareForSegue在第一個視圖控制器傳遞1視圖 - 控制裁判secondviewcontroller委託財產。

override func prepareForSegue(segue: UIStoryboardSegue?, sender: AnyObject?) { 
     let viewController = segue.destinationViewController as! SettingsViewController 
     viewController.delegate = self 
} 

HomeViewControllerviewDidLoad代碼,因爲你從故事板進行賽格瑞沒有任何意義。

修訂

@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 
+0

我沒有使用segue從第一個視圖控制器轉換到第二個。 –

+1

那麼你將如何從第一個控制器提交第二個視圖控制器? – Sahil

+0

我更新了代碼。請參閱@IBAction func rightTapped(發件人:AnyObject) –

0

變化SettingsViewController類follwing方法: -

override func viewDidLoad() { 
     rightButton = UIBarButtonItem(title: "Back", style: .Plain, target: self, action: #selector(changeNumber)) 
     self.navigationItem.leftBarButtonItem = rightButton 
    } 
+0

我爲什麼要這麼做? –

+0

因爲您沒有爲後退按鈕調用「changeNumber」方法。您正在爲右按鈕調用「changeNumber」方法,而不是後退按鈕。 –

0

嘗試這種方式,在這裏我創建了一個變量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) 
    } 
} 
+0

我沒有看到這樣做的目的。此外,應用程序在從第一個視圖控制器轉換到第二個視圖控制器時會崩潰。 –

+0

什麼是崩潰消息? –

2
@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) 
    } 
0

在這種Protocol-Sample,我打電話模擬HomeViewController的 'didChangeLine' 功能,如下圖所示的圖像相同的場景。 enter image description here

相關問題