Xcode中多个Segues中通过UITableViews传递数据(三个Segues)

Posted

技术标签:

【中文标题】Xcode中多个Segues中通过UITableViews传递数据(三个Segues)【英文标题】:Passing Data Through UITableViews In Multiple Segues in Xcode (Three Segues) 【发布时间】:2017-04-27 03:38:53 【问题描述】:

我的设置是三个视图控制器,前两个带有 UITableView,第三个带有图像。

Layout

我想通过使用 UITableViews 的 segues 将数据从 firstViewController 传递到 secondViewController,然后将两组数据传递到 thirdViewController。

我用来从 firstViewController 传递到 secondViewController 的代码如下:

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) 
    performSegue(withIdentifier: "identifier1", sender: candy[indexPath.row])


override func prepare(for segue: UIStoryboardSegue, sender: Any?) 
    let selectedCandy = segue.destination as? SecondViewController
    selectedCandy?.showCandy = sender as? String

secondViewController 中的代码非常相似:

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) 
    performSegue(withIdentifier: "identifier2", sender: flavors[indexPath.row])


override func prepare(for segue: UIStoryboardSegue, sender: Any?) 
    let selectedFlavor = segue.destination as? ThirdViewController
    selectedFlavor?.showFlavor = sender as? String

我所做的要点是在 firstViewController UITableView 中选择一个 Candy,在 secondViewController UITableView 中选择一个 Flavor,然后在 thirdViewController 中有一个标签 FLAVOR CANDY 和选择的图像。

Flavor 的标签会显示。糖果的标签没有。如何将 Candy 的 segue 中的选择传递给 thirdViewController?

提前非常感谢。

【问题讨论】:

您应该将糖果传递给最后一个控制器,在第二个 VC 中的 prepareFor:sender: 中。控制器应该有来自第一个 VC 的 showCandy 实例变量。将其传递给第三个 VC。此外,您的变量名称不是最佳的,令人困惑。 showCandy 听起来确实像一个方法,或者Bool,它真的应该是selectedCandy。在prepareFor:sender: 中,您将目标视图控制器的局部变量命名为selectedXXX,而它们确实应该采用类型名称(camelCased,如secondViewController)或至少以Controller 结尾。 selectedCandy 听起来像是被选中的对象。 谢谢谢恩!快速跟进:我将 secondViewController 中的代码修改为: override func prepare(for segue: UIStoryboardSegue, sender: Any?) let selectedFlavor = segue.destination as? ThirdViewController selectedFlavor?.showFlavor = sender as?字符串让 selectedCandy = segue.destination 为? ThirdViewController selectedCandy?.showCandy = sender as? String 但是,现在它显示了两次 Flavor 而不是 Flavor-Candy。任何想法我做错了什么?非常感谢您的帮助! 【参考方案1】:

FirstViewController

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) 
        performSegue(withIdentifier: "identifier1", sender: self.candy[indexPath.section])
    

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) 
        if segue.identifier == "identifier1" 
            let goNext = segue.destination as! SecondViewController
            goNext.showCandy = sender as! String
        
    

第二视图控制器

var showCandy = ""

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) 
        performSegue(withIdentifier: "identifier2", sender: self.flavors[indexPath.section])
    

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) 
        if segue.identifier == "identifier2" 
            let goNext = segue.destination as! ThirdViewController
            goNext.showCandy = showCandy
            goNext.showFlavor = sender as! String
        
    

第三视图控制器

var showCandy = ""
var showFlavor = ""

override func viewDidLoad() 
        super.viewDidLoad()
        print(showCandy)
        print(showFlavor)
 

【讨论】:

谢谢@iParesh。这完全回答了我的问题。你摇滚!

以上是关于Xcode中多个Segues中通过UITableViews传递数据(三个Segues)的主要内容,如果未能解决你的问题,请参考以下文章

IOS xcode 6 - Segues 不起作用

如何在 Xcode 中通过代码触发按钮

在xcode中通过sqlite3检查存在

不确定将代码放在程序中的啥位置。如何在 XCode 中通过触摸生成圆圈。 (目标-C)

在 Xcode 11 中通过 Fastlane 构建 SPM 包不起作用

在 Xcode 中通过 Objective-C 代码测试 Swift 代码