2015-10-30 3 views
4

Я пытаюсь создать пользовательскую ячейку, которая расширяется при нажатии. Я использую этот GitHub пример: https://github.com/rcdilorenzo/Cell-ExpanderНе удалось присвоить значение типа 'UITableViewCell' в 'AppName.CustomCellName'

Эта линия дает ошибку во время выполнения SIGABRT:

override func tableView(tableView: UITableView, willDisplayCell cell: UITableViewCell, forRowAtIndexPath indexPath: NSIndexPath) { 
    (cell as! EventTableViewCell).watchFrameChanges() 
    //Could not cast value of type 'UITableViewCell' (0x105aa1b80) to 'AppName.EventTableViewCell' (0x104287fe0). 
} 

Я также проверил ответ от этой должности, а затем три шага, но не повезло: Could not cast value of type 'UITableViewCell' to '(AppName).(CustomCellName)'

Мой заказ класс клетка выглядит следующим образом:

import UIKit 

class EventTableViewCell : UITableViewCell { 
... 
} 

cellForRowAtIndexPath:

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCellWithIdentifier("eventCell", forIndexPath: indexPath) 

    let date = self.eventArray[indexPath.row].startTime 
    let calendar = NSCalendar.currentCalendar() 
    let minutes = calendar.component(NSCalendarUnit.Minute, fromDate: date) 
    var minutesString: String 
    if (minutes == 0) { 
     minutesString = "00" 
    } else { 
     minutesString = String(calendar.component(NSCalendarUnit.Minute, fromDate: date)) 
    } 
    let hours = calendar.component(NSCalendarUnit.Hour, fromDate: date) 
    cell.textLabel?.text = self.eventArray[indexPath.row].title + " - \(hours):\(minutesString)" 

    return cell 
    } 
} 

Просьба помочь.

+0

показать код для метода cellForRowAtIndexPath – MobileMon

+0

@MobileMon редактировал вопрос^ –

ответ

13

«У меня есть self.tableView.registerClass (UITableViewCell.self, forCellReuseIdentifier: "eventCell") в моем представленииDidLoad "

Это, вероятно, отменяет значение, установленное в раскадровке. Попробуйте удалить эту строку или изменить ее на self.tableView.registerClass(EventTableViewCell.self, forCellReuseIdentifier: "eventCell").

+0

Я делал свой просмотр таблицы программным путем и не устанавливал имя пользовательской ячейки в методе 'registerClass', что вызвало ошибку для меня. – Suragch

1

Вы уверены, что ячейка, которую вы получаете, является экземпляром EventTableViewCell? Вы зарегистрировали свой собственный класс ячеек с помощью registerClass:forCellReuseIdentifier:?

Если вы меняете код из этого:

(cell as! EventTableViewCell).watchFrameChanges() 

к этому:

(cell as? EventTableViewCell)?.watchFrameChanges() 

вы до сих пор получить исключение?

Также вы используете одну и ту же раскадровку из примера GitHub? Если да, обновили ли вы раскадровку, чтобы использовать имя своего класса и идентификатор повторного использования? Вы используете EventTableViewCell/«eventCell», но исходный код использовал PickerTableViewCell/«cell».

+0

У меня есть self.tableView .registerClass (UITableViewCell.self, forCellReuseIdentifier: «eventCell») в моем представленииDidLoad и eventCell - это идентификатор из раскадровки. Он действительно должен что-то сделать с регистрацией ячейки, потому что ваш код работает, но когда я пытаюсь перетащить элемент (другую функцию), я получаю такую ​​же ошибку: Не удалось присвоить значение типа «UITableViewCell» (0x10d29eb80) в «CallIn.EventTableViewCell –

+0

Я не использую одну и ту же раскадровку, я использую мою, которую я приспособил. –

+0

Если вы определили «eventCell» в раскадровке, я не думаю, что вам нужно явно зарегистрировать его в коде. Какой тип вы установили для ячейки в раскадровке? Это EventTableViewCell? –

2

В раскадровке, нажмите на ячейку и установить имя класса EventTableViewCell вместо UITableViewCell

Или, если вы делаете все программно, в cellForRowAtIndexPath сделать это вместо того, чтобы:

var cell : EventTableViewCell? 
cell = tableView.dequeueReusableCellWithIdentifier(cellIdentifier) as! EventTableViewCell? 
if cell == nil { 
      cell = EventTableViewCell(style: UITableViewCellStyle.Default, reuseIdentifier: "eventCell") 
} 
return cell 
0

Как сказал @Greg Браун, решение было изменить тип ячейки для пользовательского класса клеток:

//wrong: 
self.tableView.registerClass(UITableViewCell.self, forCellReuseIdentifier: "eventCell") 

//right: 
self.tableView.registerClass(EventTableViewCell.self, forCellReuseIdentifier: "eventCell") 
Смежные вопросы