SWIFT: 将 UITableViewCell 连接到两个不同的详细视图控制器

SWIFT: Connect UITableViewCell to two different detail view controllers

假设我有一个 SWIFT 应用程序,它包含一个带有 table 的 UIViewController。 table 当然有原型 UITableViewCells。单元格中包含的信息可以是两种内部对象类型之一,比方说 Widget 和 Sprocket。 Widget 和 Sprocket 是派生自相同基础 class Thing 的对象。

我的 table 将是一个 Things 列表,其中每个 Thing 都是 Widget 或 Sprocket。我想要发生的是,如果用户选择一个 table 单元格是一个 Widget,它应该显示一个 Widget 的详细信息 ViewController,即 WidgetViewController。但是,如果用户选择 Sprocket,则应用程序应显示 SprocketViewController.

我怎样才能做到这一点?我的理解是,如果我进入情节提要并单击拖动以从主要 VC 到 WidgetViewController 或 SprocketViewController 进行转场,那么该转场将自动在应用程序中发生,即没有我添加任何代码。因此,如果我单击并拖动以创建两个这样的转场,那么我不知道会发生什么,但我认为应用程序会因尝试调用这两个转场而崩溃。

我面临的问题是,我当前的应用程序有一个 WidgetTableViewController 和一个 WidgetViewController 的故事板转场,还有一个 SprocketTableViewController 和一个故事板转场到一个 SprocketViewController,但现在我必须将 Widgets 和 Sprockets 放入同一个 VC(即 ThingTableViewController),并让应用程序有条件地启动 WidgetViewController 或 SprocketViewController.

那我该怎么做呢?

一种方法可以是:

UITableViewDelegatetableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) 函数中检查所选单元格是否对应对象 Widget 或对象 Sprocket

然后,将相应的 UIViewController 和必要的配置与此代码一起呈现:

let vc = UIStoryboard(name: "The name of your storyboard here", bundle: nil).instantiateViewController(withIdentifier: "Your VC identifier") as! YourViewController
// pass your data and configure the viewcontroller here
navigationController?.pushViewController(vc, animated: true)

在故事板中,将您认为方便的标识符分配给您的 ViewController:

Select ViewController -> 第三项 -> Identity -> StoryboardId 并检查 "Use Storyboard ID"

注意:删除你当前使用的segues

1) 要配置您的单元格,您需要拥有数据源。所以基本上你可以用这样的结构数组配置你的 tableView。

struct ViewModel { var type: CellType ... }

当您使用类型点击您的单元格时,您可以轻松找到您需要的细节控制器。

2) 在 didSelectRow 中,你的手机被窃听了

    let cell = tableView.cellForRow(at: indexPath)

然后检查它是 WidgetsCell 还是 SprocketsCell