UITableViewController 将不同的单元格插入不同的部分

Posted

技术标签:

【中文标题】UITableViewController 将不同的单元格插入不同的部分【英文标题】:UITableViewController insert different cells into different sections 【发布时间】:2016-12-21 10:04:19 【问题描述】:

我有一个 TableViewController,它有 3 个部分和它们自己的标题。 现在我想在插入任何单元格之前,检查一个属性,然后将单元格添加到不同的部分。

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell 
    // Table view cells are reused and should be dequeued using a cell identifier.
    let cellIdentifier = "TasksTableViewCell"


    guard let cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier, for: indexPath) as? TasksTableViewCell  else 
        fatalError("The dequeued cell is not an instance of TasksTableViewCell.")
    

    // Fetches the appropriate task for the data source layout.
    let task = tasks[indexPath.row]

    cell.nameLabel.text = task.name
    cell.photoImageView.image = task.photo
    cell.timeControl.text = task.lengthDisplay.replacingOccurrences(of: "Length: ", with: "")

    if(task.importanceLevel == 0)
         // add cell to section 0
    
    else if(task.importanceLevel == 1)
         // add cell to section 1
    

    // Configure the cell...

    return cell

你能看到评论吗,有什么办法吗? 非常感谢

【问题讨论】:

我认为你应该改变你的数据模型。您需要通过“importanceLevel”参数为每个任务确定部分中的行数。 'cellForRowAt' 方法应该只为部分中的每一行显示正确的单元格。过滤数据必须在此之前完成 blog.apoorvmote.com/… 这是基本的请通过... 有这方面的样本吗?谢谢 ***.com/questions/29578965/…gist.github.com/mchirico/50cdb07d20b1b0f73d7cyoutube.com/watch?v=Ifm-Tvzz31E 仍然不是我想要的 :((。但我确实改变了 sth: section = ['a', 'b', 'c'] 并成功显示这些部分。我想这样做:当检查 if (task.importanceLevel = 0) 然后将单元格添加到“a”部分,依此类推 【参考方案1】:

您可以首先为数据源方法中的每个部分和行创建一个模型并传递空计数数组。 然后初始化计数并填充数组,然后重新加载您的表格视图。 我希望你也知道还有 numberOfSections 方法。

【讨论】:

【参考方案2】:

我认为这段代码会对你有所帮助:

let arr = [5,2,7,10,2]
override func viewDidLoad() 
    super.viewDidLoad()

// MARK: - Table view data source
override func numberOfSectionsInTableView(tableView: UITableView) -> Int 
    // #warning Incomplete implementation, return the number of sections
    return 5

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
    // #warning Incomplete implementation, return the number of rows
    return arr[section]

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 
    let cell = tableView.dequeueReusableCellWithIdentifier("celldata", forIndexPath: indexPath)

    cell.textLabel?.text = "section \(indexPath.section)"
    cell.detailTextLabel?.text = "Rows \(indexPath.row)"

    return cell

override func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? 
    let view = UIView(frame: CGRect(x: 0, y: 0, width: self.tableView.frame.width, height: 20))
    let lbl = UILabel(frame: CGRect(x: 5, y: 5, width: self.tableView.frame.width, height: 15))
    lbl.text = "\(section)"
    view.backgroundColor = UIColor.grayColor()
    view.addSubview(lbl)
    return view

【讨论】:

【参考方案3】:

你可以这样试试

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


    if(indexPath.section == 0)
        let cellIdentifier = "TasksTableViewCell"

        guard let cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier, for: indexPath) as? TasksTableViewCell  else 
            fatalError("The dequeued cell is not an instance of TasksTableViewCell.")
        

     // Fetches the appropriate task for the data source layout.

        let task = tasks[indexPath.row]
        cell.nameLabel.text = task.name
        cell.photoImageView.image = task.photo
        cell.timeControl.text = task.lengthDisplay.replacingOccurrences(of: "Length: ", with: "")

        return cell
    
    else if(indexPath.section == 1)
        let cellIdentifier = "TasksTableViewCell1"

        guard let cell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier, for: indexPath) as? TasksTableViewCell1  else 
            fatalError("The dequeued cell is not an instance of TasksTableViewCell.")
        

     // Fetches the appropriate task for the data source layout.
        let task = tasks[indexPath.row]
        cell.nameLabel.text = task.name
        cell.photoImageView.image = task.photo
        cell.timeControl.text = task.lengthDisplay.replacingOccurrences(of: "Length: ", with: "")

        return cell
    

【讨论】:

感谢您的帮助。但是你知道 task.importanceLevel 只有在 let task = tasks[indexPath.row] 之后才能访问,对吗?而且我没有 TasksTableViewCell1,我只有 3 个不同的部分,我想将单元格添加到 @QuangDinhLuong 我已经更新了代码。您可以根据当前活动部分加载单元格

以上是关于UITableViewController 将不同的单元格插入不同的部分的主要内容,如果未能解决你的问题,请参考以下文章

将 UITableViewController 插入其他 UIView

将 TAB BAR 添加到 uitableviewcontroller [关闭]

如何将数据放在 UITableViewController 的正确部分?

将TAB BAR添加到uitableviewcontroller [关闭]

使用 UISegementedControl 切换到不同的 UITableViewController

故事板中具有不同单元格大小和单元格内容的 UITableViewController