如何将自定义单元格添加到动态生成的tableview中?

时间:2016-03-24 23:40:36

标签: swift uitableview

几乎在一周内我试图找出如何将静态/自定义tableviewcell附加到动态生成的tableview。我根据从数据库中获取的数据来填充单元格。基本上我想要完成的是像appDojo应用程序中的以下图片: enter image description here

您可能知道并看到,您可以使用ClassDojo应用添加任意数量的组,但最新的单元格(在本例中为 Voeg een nieuwe klas toe )将始终保持在tableview的底部。这正是我想要做的。

到目前为止我试图做的是尝试计算tableview中的最新单元格并尝试附加我的自定义单元格,但不幸的是我无法理解它。

如果有人可以帮我解决这个问题,我真的很感激。

提前致谢。

如果您需要任何代码,请告诉我。

---------编辑后的帖子---------

由于@Slayter,我确实完成了分配我的自定义单元格,但现在我面临的问题是我的自定义单元格被我动态创建的单元格(使用Alamofire)立即覆盖。

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:1)

这很简单。您只需告诉tableView预期还有一个单元格而不是数据源中的单元格。

示例

numberOfRowsInSection方法中,您将拥有以下内容:

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return myData.count + 1 // Add one for your custom cell
}

然后在cellForRowAtIndexPath方法中,您只需为indexPath

添加一些自定义逻辑
override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCellWithIdentifier(cellIdentifier, forIndexPath: indexPath) as UITableViewCell

    if indexPath.row < myData.count {
        // configure cell as normal
    } else {
        // Add your custom cell logic here
    }

    return cell
}

答案 1 :(得分:1)

ClassDojo iOS工程师在这里!非常乐意分享我们如何做到这一点。

与提到的Slayter一样,我们

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return myData.count + 1 // Add one for your custom cell
}

但此外我们还会做以下事情:

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

    var cell = nil;

    if self.indexIsForCustomCell(indexPath) {
        cell = tableView.dequeueReusableCellWithIdentifier(CustomCell.reuseIdentifier)
        // Additional configuration
    } else {
        cell = tableView.dequeueReusableCellWithIdentifier(RegularCell.reuseIdentifier)
        // Additional configuration
    }

    return cell
}

CustomCell看起来像这样(不完全):

class CustomCell: UITableViewCell {
    static let reuseIdentifier = "CustomCell"

    // More code
}

常规单元格如下:

class RegularCell: UITableViewCell {
    static let reuseIdentifier = "RegularCell"

    // More code
}

动态单元格被覆盖的原因是由于行

let cell = tableView.dequeueReusableCellWithIdentifier(cellIdentifier, forIndexPath: indexPath) as UITableViewCell

请注意,无论是自定义单元格还是常规单元格,您都使用相同的cellIdentifier。这意味着您很可能正在执行以下操作:

self.tableView.registerClass(RegularCell.class, forIdentifier: "new group")
self.tableView.registerClass(CustomCell.class, forIdentifier: "new group") 

当你应该做的时候:

self.tableView.registerClass(RegularCell.class, forIdentifier: RegularCell.reuseIdentifier)
self.tableView.registerClass(CustomCell.class, forIdentifier: CustomCell.reuseIdentifier)

OR

self.tableView.registerClass(RegularCell.class, forIdentifier: "regularCellReuseIdentifier")
self.tableView.registerClass(CustomCell.class, forIdentifier: "customCellReuseIdentifier")

通过使用相同的标识符键,您告诉UITableView将两个单元格视为相同的类型。因此,当需要为屏幕上绘制的新单元格回收内存时,它将交替使用RegularCellCustomCell

希望这有帮助,并感谢您查看我们的应用程序!

================= 编辑 =================

意识到我忘了添加indexIsForCustomCell方法。这是:

func indexIsForCustomCell(indexPath : NSIndexPath) -> Bool {

    if self.myData.count > 0 {
        return indexPath.section == 0 && indexPath.row == (self.myData.count+1)
    }

    return indexPath.section == 0 && indexPath.row == 0
}