如何按下 tableview 单元格以在导航控制器中显示带有文本的视图控制器

Posted

技术标签:

【中文标题】如何按下 tableview 单元格以在导航控制器中显示带有文本的视图控制器【英文标题】:How to press on a tableview cell to present a view controller with the text in navigation controller 【发布时间】:2019-04-18 21:38:32 【问题描述】:

基本上我有一个名为 FirstViewController 的视图控制器,该视图控制器包含一个名为 listTableView 的表视图。

我想点击表格视图 listTableView 中的一个单元格,并将单元格中的任何文本显示为导航控制器标题。

点击单元格时出现的导航控制器称为showDetailsViewController

如何做到这一点?

以下是我在FirstViewController

中写的
import UIKit
import AudioToolbox

class FirstViewController: UIViewController, UITableViewDataSource, UITableViewDelegate, FeedModelProtocol  
    var feedItems: NSArray = NSArray()
    var selectedStock : StockModel = StockModel()
    let tableView = UITableView()
    @IBOutlet weak var listTableView: UITableView!
    @IBOutlet weak var refreshButton: UIBarButtonItem!

    override func viewDidLoad() 
        super.viewDidLoad()
        //set delegates and initialize FeedModel


        self.listTableView.delegate = self
        self.listTableView.dataSource = self

        let feedModel = FeedModel()
        feedModel.delegate = self
        feedModel.downloadItems()

    

    override var preferredStatusBarStyle: UIStatusBarStyle 
        return .lightContent
    

    @IBAction func reloadData(_ sender: Any) 

        print("reload pressed")
        listTableView.reloadData()
        viewDidLoad()
        _ = AudioservicesPlaySystemSound(1519)
    



    func itemsDownloaded(items: NSArray) 

        feedItems = items
        self.listTableView.reloadData()
    

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
        // Return the number of feed items

        print("item feed loaded")
        return feedItems.count

    

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 

        // Retrieve cell
        let cellIdentifier: String = "stockCell"
        let myCell: UITableViewCell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier)!
        myCell.textLabel?.textAlignment = .center
        myCell.textLabel?.font = .boldSystemFont(ofSize: 18)
        // Get the stock to be shown
        let item: StockModel = feedItems[indexPath.row] as! StockModel
        // Configure our cell title made up of name and price


        let titleStr = [item.customer].compactMap  $0 .joined(separator: "-")


        print(titleStr)
        // Get references to labels of cell
        myCell.textLabel!.text = titleStr

        return myCell
    


更新:

这段代码有什么问题:

注意: tableview的恢复id是scheduleTable

var homeworkIdentifierFromTableViewCell = ""
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) 

        homeworkIdentifierFromTableViewCell = feedItems[indexPath.row].myCell
        self.performSegue(withIdentifier: "scheduleTable", sender: self)
        listTableView.deselectRow(at: indexPath, animated: true)

    

更新 2

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) 

    let item: StockModel = feedItems[indexPath.row] as! StockModel
    let titleStr = [item.customer].compactMap  $0 .joined(separator: "-")
    print(titleStr)



【问题讨论】:

在主故事板上设置 viewController 的标识符,与导航标题上的名称相同。然后通过在标识符参数中传递标题来实例化控制器。 【参考方案1】:

您可以使用 didSelectRowAt 来注意单击了哪个单元格并存储单元格中的文本(homeworkArray 是结构体中的单元格列表。Homeworkidentifier 是结构体中的一个值)。

var homeworkIdentifierFromTableViewCell = ""
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) 

        homeworkIdentifierFromTableViewCell = homeworkArray[indexPath.row].homeworkIdentifier

        self.performSegue(withIdentifier: "homeworktoExpandHomework", sender: self)
        homeworkTableView.deselectRow(at: indexPath, animated: true)

    

然后,您可以使用为 segue 准备的函数将表格视图单元格的文本传递给下一个视图控制器。为此,您可以在另一个视图控制器(您将向其传递数据的那个)中创建一个变量,然后从另一个视图控制器访问它并更改其值。

override func prepare(for segue: UIStoryboardSegue, sender: Any?) 
        if segue.identifier == "reportBug" 
            let destinationViewController = segue.destination as! WebViewController
            destinationViewController.reason = "reportBug"

        
        else if segue.identifier == "provideFeedback" 
            let destinationViewController = segue.destination as! WebViewController
            destinationViewController.reason = "provideFeedback"
        
    

这里是关于在视图控制器之间传递数据的更多信息:Passing data between View Controllers in Swift (From TableView to DetailViewController)

希望对你有帮助


编辑: 这是我正在使用的结构:

struct homeworkTableViewCellData 
    let homeworkName : String!
    let className : String!
    let dateName : String!
    let colorImage : UIImage!
    let homeworkIdentifier : String!

我已经用这个结构初始化了我的 homeworkArray。当我从单元格中调用一个值时,我会从结构中选择一个。

用结构体设置表格视图更有条理。这是一个很好的视频,教你如何设置它(如果你想这样做):https://www.youtube.com/watch?v=zAWO9rldyUE&list=LL--UalPCi7F16WzDFhMEg7w&index=20&t=921s

【讨论】:

Rosalie 我有个小问题,你有空吗? 我现在有空 非常感谢您的帮助,我对 Swift 没有最丰富的经验,似乎无法让您的代码正常工作。请查看我发布的更新 我相信现在的问题是 myCell 是整个 Cell 对吗?我在代码(homeworkIdentifier)中抓取的是单元格结构中的值之一。你在使用结构吗? 是的 myCell 是整个单元格。如何创建一个结构来识别单元格中的文本?

以上是关于如何按下 tableview 单元格以在导航控制器中显示带有文本的视图控制器的主要内容,如果未能解决你的问题,请参考以下文章

选择单元格以导航另一个视图控制器类时如何更改渐变单元格图像颜色

点击tableview内的collectionview单元格导航

如何在一个 tableView 上提供超过 2 个自定义单元格以进行聊天

如何通过在不同的视图控制器上按下按钮来更改 tableview 数据?

是否可以预加载所有 tableview 单元格以启用平滑滚动?

将数据从 TableView 传递到 PageViewController 的包含视图