我通过在一个部分的第一行放置横幅广告,在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
中的额外行,但我尝试的所有内容都会触发某种类型的边界异常。任何反馈将不胜感激。
答案 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
。