在 Swift 中的 ViewControllers 和条件 segues 之间传递选定的行

Posted

技术标签:

【中文标题】在 Swift 中的 ViewControllers 和条件 segues 之间传递选定的行【英文标题】:Passing selected rows between ViewControllers and conditional segues in Swift 【发布时间】:2014-11-11 18:38:05 【问题描述】:

我正在开发我的第一个应用程序,并且我已经勾勒出了 UI,但在我继续前进之前,我遇到了一个绊脚石,这不是我一直在学习的教程中的内容。

Two issues I have:
1) Passing data between TableViewControllers
2) Conditional Segues

该应用使用 CoreData,并在模型中有一个包含 3 个托管对象的上下文:FocusAreaEquipmentActivity

我的应用程序的一部分将有 3 个 TableView,它们显示从 FocusAreaEquipmentActivity 获取的结果。通过它们的导航如下:

Step 1          -> Step 2       -> Step 3       -> save selections
focusAreaTVC    -> equipmentTVC -> activityTVC  -> saveVC
equipmentTVC    -> focusAreaTVC -> activityTVC  -> saveVC
activityTVC     -> focusAreaTVC -> equipmentTVC -> saveVC

当在第 1 步中选择一个/多个项目时,“下一步”按钮将前进到第 2 步,显示在第 1 步中选择的行可用的选项。一旦用户在第 2 步中进行选择,剩余的可用选择将在步骤 3 中显示。我设想保存屏幕上的最终选择将保存为数组或字典。

问题: 1) 视图控制器:我打算使用performSegueWithIdentifier,而不是使用9个不同的视图控制器,所以我只需要为对象设置3个视图控制器并找出完成转换的逻辑。

我是否会在每个步骤中为 TVC 在AppDelegate 中创建一个全局变量,并将逻辑放入 performSequeWithIdentifier 内的每个 VC 的 switch 语句中?

示例:

// AppDelegate variables start all nil, updated at each step, reset to nil on save
var step1VC = "equipmentVCUsed"
var step2VC = "focusAreaTVCUsed"
var step3VC = nil

// VC switch statement (contained in each TableViewController)
var segueIdentifier: String

switch segueName 
case step1TVC = "focusAreaTVC":
    segueName = "equipmentTVC"
case step1TVC = "equipmentTVC:
    segueName = "focusAreaTVC"
case step1TVC = "activityTVC":
    segueName = "focusAreaTVC"
case step2TVC = "equipmentTVC":
    segueName = "activityTVC"
case step2TVC = "focusAreaTVC", step1VC = "equipmentVC":
    segueName = "activityTVC"
case step2TVC = "focusAreaTVC", step1VC = "activityVC":
    segueName = "equipmentTVC"
case step3VC != nil,
    segueName = "saveVC"
    step1TVC = nil
    step2TVC = nil
default:
    println("Something so the the compiler doesn't yell at me")

2) 我计划在第 1 步中进行选择并将它们传递给第 2 步的 VC,在那里进一步细化,然后传递到第 3 步。由于它们都在相同的上下文中工作,我可以只传递来自 1 个 TVC 的选择吗到另一个,或者我需要创建一个列表,下一个 VC 将从中检索项目?

如何获取第 1 步到第 3 步的信息?我是否必须将选择保存在 segue 之间的数组中,并使用每个 VC 中的提取来优化它们?

【问题讨论】:

【参考方案1】:

为什么不通过点击表格视图单元格来触发转场?换句话说,让它像这样:用户从第一个表视图中选择选项 -> 用户然后看到第二个表视图并从适当的选项集中进行选择 -> 用户然后看到第三个表视图并从适当的选项集中进行选择。您始终可以在顶部放置一个后退按钮,以便用户可以返回并更改他/她的选择。

您的用户可能希望并期望您的应用具有这样的行为。

无论如何,回答你的问题:

1) 我建议您创建一个 UIViewController 超类,您的子类从该超类继承,然后在该类的 .h 文件中定义一个属性,该属性可以设置为一个对象,该对象包含每个视图控制器需要传递给下一个视图的任何数据控制器。然后,使用 prepareForSegue 传递下一个视图控制器需要的数据。

2) 您可以将选择从 1 个 TVC 传递到另一个(参见 #1)

编辑:如果您需要任何澄清,或者您觉得我误解了您的问题,请随时发表评论。我昨晚睡了不到 5 个小时。

【讨论】:

谢谢。我试图将它全部保留在 Swift 中,并且我想避免与 Objective C 混淆。我开始学习 Obj-C/CoreData 并且当我完成了 ~1/2 的方式时,Apple 切换到了 Swift。我了解它的基础知识,但如果我不需要的话,我宁愿不要和 Obj-C 一起玩。我没有向 SQLite DB 添加任何内容。我只是在选择、优化和保存一个列表。 再次感谢您的回复。我在健身房考虑过,我认为你是对的……不必要的复杂。我想我要做一个选择器 VC,它设置参数以插入 TVC 以显示。 #LessDrama

以上是关于在 Swift 中的 ViewControllers 和条件 segues 之间传递选定的行的主要内容,如果未能解决你的问题,请参考以下文章

如何将 ViewController.swift 连接到 Storyboard 中的 ViewController?

Swift - 出现在上下文中的 ViewController 的深色背景

从 Swift 中的其他类更改 ViewController 的对象

同一 ViewController 中的两个 tableViews 不会在 swift 3 中显示

如何在 Swift 中的 AppDelegate 中抓取 Viewcontroller

使用 Swift IOS 在不同 ViewController 中的相同功能