2016-01-11 2 views
0

Я внедряю AdMob в UITableView, помещая баннер в первую строку раздела. Я больше всего использую его, но мне трудно получить cellForRowAtIndexPath для работы по своему желанию.Программно изменяющий NSIndexPath в Swift

Это то, что мой 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

Что произойдет, если вы удалите следующие строки 'let newIndexPath = indexPath.indexPathByAddingIndex (indexPath.row + 1) indexPath = newIndexPath' и использовать фактический индекс? –

ответ

2

indexPathByAddingIndex добавляет новый индекс, он не увеличивает значение индекса, а добавляет его. Если у вас ранее были два индекса/размерности (раздел и строка), теперь у вас есть 3 индекса/размер: секция, строка и «новый добавленный».

Предоставляет индексный путь, содержащий индексы в пути указателя приема и другом индексе.

Вместо этого вы должны создать новый NSIndexPath вручную. И я не думаю, что вам нужно добавить один, но вычесть один, так как элемент с индексом 1 должен быть на самом деле элементом в вашем результате по индексу 0:

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

который затем используется для доступа к «правильному» routine на правом индекс:

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

Ваш призыв к tableView.dequeueReusableCellWithIdentifier должен оставаться таким же и до сих пор проходят в по умолчаниюindexPath.

+0

Спасибо! Это имеет смысл. Я возвращаю правильные объекты в 'lldb', но по какой-то причине он говорит, что для' customCell.routineNameLabel.text' существует значение «nil». 'lldb' говорит, что есть значение' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ''. Я также могу «po» значение для 'customCell', но он говорит, что для' customCell.routineNameLabel.text' существует значение nil. Я собираюсь перепроверить проводку. Я думаю, что добавление дополнительного прототипа могло сломать что-то. – Adrian

+0

Не знаю, почему, но Xcode не понравился мой «RoutineSelectionTableViewCell» после того, как я внедрил предложенные вами изменения. Я пошел в Interface Builder, отключил старые подключения, перезаписал их, очистил кеш и перестроил, и он сработал. Еще раз спасибо. – Adrian

+1

@AdrianB, который звучит странно, но рад помочь! – luk2302

Смежные вопросы