Adrian
Adrian

Reputation: 16725

Programmatically altering NSIndexPath in Swift

I'm implementing AdMob in a UITableView by putting banner ad in the first row of a section. I'm most of the way there implementing it, however I'm having a tough time getting cellForRowAtIndexPath to work as desired.

This is what my numberOfRowsInSection looks like:

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
}

My cellForRowAtIndexPath looks like this:

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
    }
}

I know I need to adjust the value of the indexPath to account for an extra row in the indexPathSection, but everything I've tried triggers out of bounds exceptions of some sort. Any feedback would be greatly appreciated.

Upvotes: 0

Views: 858

Answers (1)

luk2302
luk2302

Reputation: 57124

indexPathByAddingIndex adds a new index, it does not increment a value of an index but adds one. If you previously had two indices / dimensions (section and row) you now have 3 indices / dimension: section, row and "the newly added one".

Provides an index path containing the indexes in the receiving index path and another index.

What you should do instead is either create a new NSIndexPath by hand. And I do not think you need to add one, but subtract one, since the item at index 1 should actually be the element in your result at index 0:

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

which you then use to access the "correct" routine at the right index:

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

Your call to tableView.dequeueReusableCellWithIdentifier should stay the same and still pass in the default indexPath.

Upvotes: 2

Related Questions