在Swift

时间:2016-01-11 19:46:09

标签: ios swift uitableview

我通过在一个部分的第一行放置横幅广告,在UITableView中实施AdMob。我实施它的大部分方式,但是我很难让cellForRowAtIndexPath按照需要工作。

这就是我numberOfRowsInSection的样子:

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    var count = Int()
    if let sections = fetchedResultsController.sections {
        let currentSection = sections[section]
        count = currentSection.numberOfObjects
        count = count + 1 // add another row for an ad
    }
    return count
}

我的cellForRowAtIndexPath看起来像这样:

override func tableView(tableView: UITableView, var cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    if indexPath.row == 0 {
        let adCell: BannerAdTableViewCell = tableView.dequeueReusableCellWithIdentifier(BannerAdTableViewCell.reuseIdentifier(), forIndexPath: indexPath) as! BannerAdTableViewCell
        // customization
        return adCell
    } else {
        // Cell for vanilla item to display
        // TODO: fix indexpath here. need to add 1
        let newIndexPath = indexPath.indexPathByAddingIndex(indexPath.row+1)
        indexPath = newIndexPath

        // Cell for a Routine
        let customCell = tableView.dequeueReusableCellWithIdentifier(RoutineSelectionTableViewCell.reuseIdentifier(), forIndexPath: indexPath) as! RoutineSelectionTableViewCell
        let routine = fetchedResultsController.objectAtIndexPath(indexPath) as! SavedRoutines

        customCell.routineNameLabel.text = routine.routineTitle

        return customCell
    }
}

我知道我需要调整indexPath的值来考虑indexPathSection中的额外行,但我尝试的所有内容都会触发某种类型的边界异常。任何反馈将不胜感激。

1 个答案:

答案 0 :(得分:2)

indexPathByAddingIndex添加了一个新索引,它不会增加索引的值,而是添加一个。如果你以前有两个索引/维度(部分和行),你现在有3个索引/维度:section,row和“new added one”。

  

提供包含接收索引路径中的索引和另一个索引的索引路径。

您应该做的是手动创建一个新的NSIndexPath。而且我认为您不需要添加一个,而是减去一个,因为索引1处的项实际上应该是索引0处结果中的元素:

let customIndexPath = NSIndexPath(forRow: indexPath.row - 1, inSection: indexPath.section)

然后您可以使用它来访问右侧索引处的“正确”routine

let routine = fetchedResultsController.objectAtIndexPath(customIndexPath) as! SavedRoutines

您对tableView.dequeueReusableCellWithIdentifier的来电应保持不变,并且仍会传递默认 indexPath