2016-11-24 182 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

相关问题