【问题标题】:I have two TableViews on a single View Controller, how can I pass data to a separate View Controller based upon which TableView was tapped?我在一个 View Controller 上有两个 TableView,如何根据被点击的 TableView 将数据传递给单独的 View Controller?
【发布时间】:2020-04-18 06:48:34
【问题描述】:

首先,如果之前有人问过这个问题,或者回答起来是否相对简单,我深表歉意。总的来说,我对 Swift/编程比较陌生,并且仍在尽可能多地自学。我通常会查看开发者文档/reddit/google 以获取我所遇到问题的答案。如果有更好的方法来寻找答案或支持,如果可能的话,我将不胜感激任何一般提示或技巧!

在我目前正在处理的项目中,我的一个视图控制器包含两个单独的 TableView,每个都由来自主数组的过滤结果填充。主阵列由课程组成,每个课程都有名称、学习类型和主题。这两个过滤后的数组是根据课程的学习类型过滤的:

var visualArray: [Module] = AllModules.modulesArray.filter { $0.learningType == .visual }
var kinestheticArray: [Module] = AllModules.modulesArray.filter { $0.learningType == .kinesthetic }

我想要完成的是根据用户点击的课程将模块的名称和模块的描述传递给单独的视图控制器。我试图在 'didSelectRowAt' 方法和 'prepare(for segue:)' 方法中完成此操作,但无济于事。我想要发生的是目标控制器上标签的文本属性,以显示所选课程的名称,实际发生的是标签保持不变。

这是我上面提到的 prepare(for segue:) 方法的当前代码:

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {

    let tableView = UITableView()

    // Set up indexPath
    guard let visualIndexPath = visualTableView.indexPathForSelectedRow,
        let kinestheticIndexPath = kinestheticTableView.indexPathForSelectedRow else { return }
    let visualModules = visualArray[visualIndexPath.row]
    let kinestheticModules = kinestheticArray[kinestheticIndexPath.row]

    // Set up destination
    guard let destVC = segue.destination as? ModuleVC else { return }
    if tableView == visualTableView {
        print(visualModules.name, visualModules.description)
        destVC.moduleName = visualModules.name
        destVC.moduleDescription = visualModules.description
    } else if tableView == kinestheticTableView {
        destVC.moduleName = kinestheticModules.name
        destVC.moduleDescription = kinestheticModules.description
    }

}

这是我当前的目标视图控制器代码:

class ModuleVC: UIViewController {

var moduleName: String?
var moduleDescription: String?

override func viewDidLoad() {
    super.viewDidLoad()

    setUI()

    self.navigationItem.largeTitleDisplayMode = .never
    self.navigationController?.navigationBar.prefersLargeTitles = false
}

@IBOutlet var moduleNameLabel: UILabel!
@IBOutlet var moduleDescriptionLabel: UILabel!

func setUI() {

    guard let moduleName = moduleName, let moduleDescription = moduleDescription else {return}
    moduleNameLabel.text = moduleName
    moduleDescriptionLabel.text = moduleDescription

}

}

任何帮助,即使是朝着正确方向迈出的一小步,我们都将不胜感激。感谢您的宝贵时间!

【问题讨论】:

    标签: ios swift uitableview uiviewcontroller tableview


    【解决方案1】:

    据我所知,问题在于您在 prepare(for segue:) 方法中实例化了一个通用 tableView,然后进行某种检查以查看 tableView 是否等于您的 visualTableView 或 kinestheticTableView。这些条件都不会满足,因为您将它们与新创建的 tableView 进行比较,其中没有任何内容,甚至没有在您的视图中布置。

    听起来您尝试做的事情应该在 UITableViewDelegate 的didSelectRow 委托方法中完成,正如您之前暗示的那样。听起来你可能没有设置正确。

    在 UITableViewDelegate 的 didSelectRowAt 方法中,当点击 tableView 行时,委托方法将触发,并将作为参数传递给被点击的 tableView。然后,您可以使用它来运行检查,如果点击这两个 tableView 之一,它应该会成功。这是我认为你可以做的一个例子:

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        if tableView == visualTableView {
            let visualModules = visualArray[indexPath.row]
            print(visualModules.name, visualModules.description)
            // Now call your segue and pass along the data from those modules
        } else if tableView == kinestheticTableView {
            let kinestheticModules = kinestheticArray[indexPath.row]
            // Now call your segue and pass along the data from those modules
        }
    }
    

    【讨论】:

    • 当你说调用 segue 时,你的意思是调用 prepare(for segue:) 方法,还是在 didSelectRowAt 方法中设置 segue?
    • @C0rvinus - 我的意思是调用perform(segue) 方法来调用你的segue。您可以做的另一件事是创建一个您想要展示的新 VC 的实例并调用present(viewController:)。然后你甚至不需要在prepare(for segue:) 方法中使用segue 或设置任何东西。您可以通过执行let newVC = NewViewControllerClassName() 之类的操作分配新VC 的属性,然后说newVC.arrayName = visualModels 之类的操作,然后输入present(newVC, animated: true, completion: nil)
    • @C0rvinus - 每当您执行 segue 时,prepare(for segue) 方法将在实际调用 segue 之前调用,因此您所做的任何准备工作都将完成,以便在 segue 完成后一切准备就绪.
    • 啊!谢谢你的澄清。最初,我只有一个从源视图控制器到目标视图控制器的 segue,但现在我有两个。它们现在从每个 tableView 原型单元到目标视图控制器,我不确定这是否会改变任何东西。我尝试了 deselectRowAt 方法,但奇怪的是它仍然不起作用。由于我现在有两个 segue,我再次尝试了 prepare(for segue) 方法,但仍然没有骰子。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-19
    • 2019-06-15
    • 1970-01-01
    • 2020-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多