首先,如果这个问题之前被问过,或者回答起来相对简单,我深表歉意。总的来说,我对 Swift/编程相对较新,并且仍在尽可能多地自学。我通常会查看开发人员文档/reddit/google以获取我问题的答案。如果有更好的方法来寻找答案或支持,如果可能的话,我将非常感谢任何一般提示或技巧!
在我目前正在处理的项目中,我的一个视图控制器包含两个单独的 TableViews,每个视图都由来自主数组的筛选结果填充。主数组由课程组成,每个课程都有名称、学习类型和主题。两个筛选的数组根据课程的学习类型进行筛选:
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
}
}
任何帮助,即使是朝着正确方向迈出的一小步,也将不胜感激。谢谢你的时间!
据我所知,问题在于您在prepare(for segue:)
方法中实例化了一个通用的 tableView,然后进行某种检查以查看 tableView 是否等于您的 visualTableView 或 kinestheticTableView。这两个条件都不会满足,因为您要将它们与新创建的 tableView 进行比较,该视图没有任何内容,甚至没有在您的视图中布局。
听起来您尝试执行的操作应该在 UITableViewDelegate 的didSelectRow
委托方法中完成,正如您之前所暗示的那样。听起来您可能没有正确设置它。
在 UITableViewDelegate 的didSelectRowAt
方法中,当点击 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
}
}