通过选择表格视图单元格创建新视图
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)
【讨论】:
以上是关于通过选择表格视图单元格创建新视图的主要内容,如果未能解决你的问题,请参考以下文章