【问题标题】:Segue to tableview from a tableview but display different data for the tableview depending on which cell is selected从表格视图转到表格视图,但根据选择的单元格为表格视图显示不同的数据
【发布时间】:2020-07-17 17:33:42
【问题描述】:

是否可以根据选择前一个表视图的哪个单元格将不同的数据呈现给同一个表视图?

例如,上面的第一个表视图已经填充了数据,然后我希望单元格链接到另一个表视图,该表视图应该包含每个单元格中的项目。目前我只能让它在表格中显示相同的数据。

那么,当从前一个视图控制器中选择不同的单元格时,我将如何在同一个表格视图中显示不同的数据并呈现不同的数据?数据以数组的形式从核心数据中保存和拉取。

这可能吗,还是我需要创建不同的表格视图以供用户填充?

这是第一个 TableViewController 的代码:

import UIKit

class ListsViewController: UITableViewController {
    
    let viewController = ListNameViewController()
    let context = (UIApplication.shared.delegate as? AppDelegate)?.persistentContainer.viewContext
    
    override func viewDidLoad() {
        super.viewDidLoad()
        viewDidAppear(false)
    }
    
    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(false)
        viewController.loadList()
        self.tableView.reloadData()
    }
    
    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return viewController.listName.count
    }

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell3", for: indexPath)
        let result = viewController.listName[indexPath.row]
        cell.textLabel?.text = ("\(String(result.listName!))")
    
        return cell
    }
    
    override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) {
        if editingStyle == .delete {
            context!.delete(viewController.listName[indexPath.row])
            viewController.listName.remove(at: indexPath.row)
            viewController.saveList()
            self.tableView.reloadData()
            
        }

    }
    
   override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
              performSegue(withIdentifier: "items", sender: self
          }
}

这是第二个视图控制器的代码:

import UIKit
import CoreData

class RootListsViewController: UITableViewController {
    
    var titleName = ""
    var newListItem : String = ""
    var item : [ListItem] = [] //listItems Coredata
    let context = (UIApplication.shared.delegate as? AppDelegate)?.persistentContainer.viewContext
    
    
    override func viewDidLoad() {
        super.viewDidLoad()

        
    }
    
    @IBAction func addItem(_ sender: Any) {
        
        
        
    }
    
    
    @objc func returnHome(sender: UIBarButtonItem) {
        
    performSegue(withIdentifier: "home", sender: self)
        
    }
    
    @objc func returnList(sender: UIBarButtonItem) {
        
        //performSegue(withIdentifier: "list", sender: self)
        tabBarController?.selectedIndex = 0
        
    }

    
    // MARK: - Table view data source

     override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
         // #warning Incomplete implementation, return the number of rows
        return item.count
     }

     override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
         let cell = tableView.dequeueReusableCell(withIdentifier: "listCell", for: indexPath)
        
        let result = item[indexPath.row]
        cell.textLabel?.text = ("\(String(result.name!))")

         return cell
     }
    
   override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        //performSegue(withIdentifier: "items2", sender: self)
    
    
        
    }
    
    var label: UILabel {
        let label = UILabel(frame: tableView.bounds)
        label.text = "empty"
        return label
    }
    
    func saveList() {
           
           do {
             try context!.save()
           } catch {
             print("Error saving context \(error)")
         }
           
       }
       
       func loadList() {
             
             let request : NSFetchRequest<ListItem> = ListItem.fetchRequest()
             
             do{
               item = try context!.fetch(request)
             } catch {
                 print("Error loading categories \(error)")
             }
         }
    
    override func viewDidAppear(_ animated: Bool) {
          super.viewDidAppear(false)
          loadList()
          self.tableView.reloadData()
      }
}

对不起,如果这是一个愚蠢的问题,似乎找不到答案。

【问题讨论】:

    标签: swift tableview segue


    【解决方案1】:

    最佳做法是为不同的表视图设置不同的视图控制器,例如,您可能希望有单独的屏幕来显示不同的数据源。但是,理论上,您应该能够通过以编程方式将表视图上的数据源切换到不同的数据源,然后刷新视图来完成您尝试做的事情:

    tableView.dataSource = newDataSource
    tableView.reloadData()
    

    不完全清楚你想要做什么,但这应该会让你朝着正确的方向前进。

    【讨论】:

      【解决方案2】:

      在第一个VC中创建函数:

          override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
          if segue.identifier == "items" {
              let controller = segue.destination as! RootListsViewController
              controller.XXX = sender.XXX
          }
      }
      

      其中 XXX 是您要传递的变量(o stuct),它必须在第二个 VC 中定义为 var。 例如,如果我点击一行,我可以说:

      controller.itemPassed = sender.textLabel?.text
      

      并且 itemPassed 必须在第二个 VC 中声明为字符串。 发件人是您正在点击的行,传递的变量可以是everithing,通常是隐藏在行中的结构或类。 如果您使用的是核心数据,您可以简单地传递一个索引,然后在第二个 VC 中从核心数据中提取所需的信息。 当您通过过滤器时,您将切换数据源并加载新的 VC。

      因布局错误而编辑

      【讨论】:

      • 所以我遵循了上述内容,但我正在努力解决应该在 sender.XXX 部分中输入的内容,我正在使用:if segue.identifier == "items" { let controller = segue.目的地! RootListsViewController let indexPath = tableView.indexPathForSelectedRow controller.self.item = sender[indexPath.row] 这会产生错误 Value of type 'Any?'没有下标。我应该怎么做才能避免这个错误?我以为sender会用来发送选择哪个cell的位置?
      • 发件人是您点击的实际对象,在本例中是您的表格视图中的特定行。您不需要 indexPath 常量,因为 sender.index 应该已经是您要查找的内容。否则使用您的 indexPath 但更正 controller.self.item = indexPath.row 中的下一行
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多