通过选择表格视图单元格创建新视图

Posted

技术标签:

【中文标题】通过选择表格视图单元格创建新视图【英文标题】:Creating new views from selecting a tableview cell 【发布时间】:2020-05-21 11:15:21 【问题描述】:

现在我有一个表格视图,它有一个基本样式的动态单元格。目前,名称列表显示在表格视图中,但我想使用 didSelectRowAt 函数为每一行创建新的详细视图。每次从我的表格视图中选择某一行时,我将如何创建一个可自定义的新视图控制器?此外,我的故事板通过名为“show”的 segue 从单元连接到另一个名为“SecondViewController”的视图控制器。

这是我到目前为止的代码。

import UIKit

class ViewController: UIViewController 

@IBOutlet weak var searchBar: UISearchBar!
@IBOutlet weak var tableView: UITableView!

struct Data 
    var sectionTitle = String()
    var rowTitles = [String]()


var dataArray = [Data(sectionTitle: "section 1", rowTitles: ["row 1", "row 2"]),
    Data(sectionTitle: "section 2", rowTitles: ["row 1", "row 2", "row 3"]),
    Data(sectionTitle: "section 3", rowTitles: ["row 1"])
]
var searchArray = [Data]()
var searching = false

override func viewDidLoad() 
    super.viewDidLoad()

    tableView.delegate = self
    tableView.dataSource = self


override func prepare(for segue: UIStoryboardSegue, sender: Any?) 
    <#code#>




extension ViewController: UITableViewDelegate, UITableViewDataSource 
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
    if searching 
        return searchArray[section].rowTitles.count
     else 
        return dataArray[section].rowTitles.count
    

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
    let cell = tableView.dequeueReusableCell(withIdentifier: "searchCell")
    cell?.textLabel?.lineBreakMode = NSLineBreakMode.byWordWrapping
    cell?.textLabel?.numberOfLines = 3
    if searching 
        cell?.textLabel?.text = self.searchArray[indexPath.section].rowTitles[indexPath.row]
     else 
        cell?.textLabel?.text = self.dataArray[indexPath.section].rowTitles[indexPath.row]
    
    return cell!

func numberOfSections(in tableView: UITableView) -> Int 
    if searching 
        return searchArray.count
     else 
        return dataArray.count
    


func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? 
    return dataArray[section].sectionTitle


func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) 
    self.performSegue(withIdentifier: "show", sender: self)




extension ViewController: UISearchBarDelegate 
func searchBar(_ searchBar: UISearchBar, textDidChange searchText: String) 
    if searchBar.text == nil || searchBar.text == "" 
        searching = false
        view.endEditing(true)
        tableView.reloadData()
     else 
        searching = true
        searchArray = dataArray.filter($0.sectionTitle.lowercased().contains(searchBar.text!.lowercased()) || $0.rowTitles.map$0.lowercased().contains(searchBar.text!.lowercased()))
        tableView.reloadData()
    


【问题讨论】:

你是在问如何用数据初始化一个新的 viewController 并将其显示或推送到堆栈上吗? 是否要将选定的数据模型传递给 SecondViewController? 是的。我将如何获取任何 tableview 单元并将其推送到自定义 viewController? 我不想将任何数据传递给 SecondViewController。 请不要命名自定义结构Data。它可能会干扰具有相同名称的 Foundation 结构。 Section 怎么样?然后你甚至可以用title重命名sectionTitle 【参考方案1】:

首先,我不确定您的结构是否真的被称为 Data,以防您应该将其更改为更详细的内容。

将您的结构移到该视图控制器之外,使其具有全局性。

创建一个新的视图控制器

import UIKit

class DetailedController: UIViewController 

    var data: Data!

    init(data: Data) 
        self.data = data
        super.init(nibName: nil, bundle: nil)
    

    required init?(coder: NSCoder) 
        fatalError("init(coder:) has not been implemented")
    



在你的 didSelectRowAtMethod 中

let index = indexPath.row
let data = dataArray[index]
let detailedVC = DetailedController(data: data)
navigationController?.pushViewController(detailedVC, animated: true)

【讨论】:

以上是关于通过选择表格视图单元格创建新视图的主要内容,如果未能解决你的问题,请参考以下文章

重新加载表视图数据并取消选择单元格

在表格视图中按下单元格上的按钮时如何创建新单元格

如何在表格视图中显示表格单元格的详细视图?

除非快速选择所有单元格,否则限制表格视图

将单元格移动到表格视图中的新部分

如何通过选择表格视图单元格获取字典值?