2016-02-17 3 views
-1

Я конвертирую приложение из объектива-c в быстрое. Я не написал объектный код c. Одна из функций, которые кодируют как ниже ...Невозможно преобразовать из UITableViewCell в указанный тип

func tableView (tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 

    let cellIdentifier: String = "Cell" 

    var cell: ListCell? = tableView.dequeueReusableCellWithIdentifier(cellIdentifier)!    

И Theres больше кода в функции, но я не думаю, что это имеет отношение. Когда я запускаю приложение, я получаю сообщение об ошибке: "nil found while unwrapping an optional" в строке, где я создаю переменную cell. Ошибка возникает, потому что я пытаюсь преобразовать UITableViewCell в тип ListCell. И конверсия происходит и возвращает нуль. Мне нужно иметь эту строку в коде, потому что она есть в объектной версии приложения.

Есть ли способ обойти это и преобразовать UITableViewCell в ListCell без преобразования и возврата нулевого значения?

Вот декларация ListCell класса ...

@interface ListCell : UITableViewCell { 
    //code 
} 

Я не конвертировать ListCell класса быстр, и вместо того, чтобы использовать заголовок мостовой. Также ListCell является подклассом UITableViewCell, поэтому почему преобразование не работает.

+0

Вам необходимо проверить раскадровку и убедиться, что класс для ячейки прототипа с reuseIdentifier 'Cell' установлен в' ListCell'.Кроме того, ваша линия dequeue выглядит странно; вы назначаете неявно развернутую опцию для необязательного. Обычно вы увидите 'var cell = dequeueReusableCellWithIdentifier (cellIdentifier) ​​как! ListCell' - но вам все еще нужно установить класс ячеек для этого, чтобы он работал – Paulw11

ответ

0

Существует два способа использования dequeueReusableCellWithIdentifier. Наиболее распространенным «современным» способом является регистрация идентификатора повторного использования и определение пользовательского класса для вашей ячейки в раскадровке. Вы также можете использовать метод UITableViewregisterClass:forCellReuseIdentifier, чтобы сделать то же самое программно.

tableview.registerClass(ListCell.self, forCellReuseIdentifier:"Cell") 

В этом случае вы бы сказали

var cell=tableview.dequeueReusableCellWithIdentifier(cellIdentifier) as! ListCell 

Вы можете использовать вынужденный подавленным, потому что вы знаете, что операция Dequeue будет возвращать ячейку соответствующего типа (а если нет, то у вас есть проблемы и бросать исключение хорошо, чтобы вы могли его отлаживать).

«Старый» способ состоял в том, чтобы не регистрировать класс и не иметь дело с тем фактом, что dequeueReusableCellWithIdentifier может вернуться nil - В этом случае вам нужно назначить новую ячейку самостоятельно;

var cell:Listcell 

if let reuseCell = tableview.dequeueReusableCellWithIdentifier(cellIdentifier) as? ListCell { 
    cell=reuseCell 
} else { 
    cell=ListCell(style: .Default, reuseIdentifier: cellIdentifier) 
} 
// Now you can configure cell... 
+0

Можете ли вы отправить строку кода для регистрации класса –

+0

см. Мой обновленный ответ – Paulw11

0

его должно быть

var cell: ListCell? = tableView.dequeueReusableCellWithIdentifier (cellIdentifier) ​​как! ListCell

+0

Я пробовал это, и он все еще разворачивает значение nil –

+0

попробуйте принудительно разворачивать, как это, var cell = tableView.dequeueReusableCellWithIdentifier (cellIdentifier) ​​as! ListCell – cnu

+0

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

0

Попробуйте это, оно должно работать нормально.

func tableView (tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 
{ 
let cellIdentifier: String = "Cell" 
var cell = tableView.dequeueReusableCellWithIdentifier(cellIdentifier) as! ListCell 
+1

Одна проблема, о которой я забыл упомянуть. Сразу после этой строки у меня есть строка, в которой говорится: if cell == nil {do something}. Поэтому я хочу, чтобы ячейка была необязательным типом. –

+0

Удалите эту строку в этом случае –

+0

Также проверьте имя класса, связанное с ячейкой в ​​раскадровке/xib. –

0

Вы должны использовать эту версию:

let cell = tableView.dequeueReusableCellWithIdentifier("Cell", 
    forIndexPath: indexPath) as! ListCell 

В DEQUEUE версию метода с индексом пути никогда не возвращает ноль (создает новые клетки автоматически, когда это необходимо).

Принудительная сила as! либо имеет значение, не являющееся необязательным, либо сбой приложения (в этом случае, если ячейка не была фактически ListCell).

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