使用标签和PerformSegueWithIdentifier通过tabBar DidSelectItem传递数据

时间:2017-03-08 07:24:04

标签: ios swift segue

我正在使用swift 3有一个taBbar,当我选择tabBarItem时,会以编程方式调用segue以转到新的View Controller。我还需要用这个segue传递一些数据。

我的代码(对于tabbar didSelectItem):

 func tabBar(tabBar: UITabBar, didSelectItem item: UITabBarItem) {
        if item.tag == 0 {
            self.performSegueWithIdentifier("nearbyHotelsSegue", sender: nil)
        } else if item.tag == 1 {
            self.performSegueWithIdentifier( "nearbyRestaurantsSegue", sender: nil)
        } else if item.tag == 2 {
            self.performSegueWithIdentifier( "nearbyEventsSegue", sender: nil)
        } else if item.tag == 3 {
            self.performSegueWithIdentifier( "morePlacesSegue", sender: nil)
        } 
    }

从我迄今为止的研究中,我知道可以使用PrepareForSegue,但我不能在tabBar(didSelectItem)方法中使用它。如何使用tabbar didSelectitem方法传递数据,还是有其他好方法可以实现这一点? 感谢。

2 个答案:

答案 0 :(得分:1)

prepareForSegue方法用作重写方法,因此您应该使用tabBar函数的边界。当您致电performSegue(withIdentifier: "segueName", sender: nil)时,您已在发件人中提供nilSenderAny?类型的参数,您可以将要传递的自定义数据传递给另一个控制器。在prepare(forSegue: UIStoryboardSegue, sender: Any?)中,当您将目标视图控制器转换为要使用的视图控制器时,将发送方数据传递给此控制器,例如:

override func prepare(forSegue: UIStoryboardSegue, sender: Any?) {
if let controller = segue.destination as? YourDestinationViewController {
controller.receivedData = sender
}
}

答案 1 :(得分:0)

我使用以下代码解决了这个问题。似乎prepareForSegue不受使用PerformSegueWithIdentifier以编程方式执行segue的影响。
所以我使用了问题中未发布的代码,然后添加了以下代码来传递数据。

 override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        if segue.identifier == "nearbyHotelsSegue" {

            if let toViewController = segue.destinationViewController as? NearbyHotelsViewController {
                toViewController.returnedText = (searchBaseItem?.baseItemId)!
            }
        }

//....other ifs
}