2015-10-23 2 views
1

У меня есть следующий код. Я использую все Xcode предложения возможно плюс различные источники на SO и т.д., но я не могу исправить дополнительные вопросы:Варианты развязки для UITableViewCell

var cell = 
     tableview!.dequeueReusableCellWithIdentifier(identifier as String) as? UITableViewCell? 

     if (cell == nil) 
     { 
      cell = UITableViewCell(style: UITableViewCellStyle.Default, reuseIdentifier:identifier as String) 
      cell.backgroundColor = UIColor.clearColor() 
// ERROR HERE 
     } 

     cell.textLabel?.text = dataArray.objectAtIndex(indexPath.row).valueForKey("category_name") as! String 
     // ERROR HERE 

     var str = String(format: "%@%@%@",kServerURl,"/upload/",dataArray.objectAtIndex(indexPath.row).valueForKey("category_image") as! String) 

     cell?.imageView?.image = UIImage(data: NSData(contentsOfURL: NSURL(string:str)!)!) 
// ERROR HERE 

     return cell 
//ERROR HERE 

Ошибка:

VALUE OF OPTIONAL TYPE UITABLEVIEWCELL NOT UNWRAPPED DID YOU MEAN TO USE ! or ?

Не имеет значения, если я использую! или ? Я получаю ту же ошибку, в некоторых случаях ошибка будет устранена, если два! добавлены ярусная ячейка !!.

ответ

4

Проблемы в вас есть двойной опциональная здесь происходит:

var cell = 
    tableview!.dequeueReusableCellWithIdentifier(identifier as String) as? UITableViewCell? 

as? говорит бросок может потерпеть неудачу, поэтому он заворачивает значение, которое вы произнесение внутри необязательный. Это значение, которое вы отливаете, равно также опционально (String?). Итак, если вы посмотрите на значение ячейки в отладчике, вы увидите что-то вроде:

Optional(Optional(<UITableViewCell:0x14f60bb10

Вы можете развернет это явно делает:

cell!! (два восклицания), но это своего рода грязный. Вместо этого вам нужно только одно из таких отливок:

var cell = 
    tableview!.dequeueReusableCellWithIdentifier(identifier as String) as? UITableViewCell 

Уведомление Я удалил последний вопросительный знак. Тогда вы можете просто сделать:

cell!.backgroundColor = UIColor.clearColor() 

Последним вариантом является просто силой разворачивать ее в первую очередь с восклицанием вроде так:

tableview!.dequeueReusableCellWithIdentifier(identifier as String) as! UITableViewCell 

Итак все, что вам нужно, это:

cell.backgroundColor = UIColor.clearColor() 
1

Переменная ячейки необязательна типа UITableViewCell ?, поэтому вам необходимо развернуть ее перед ее использованием. Вероятно, вам стоит почитать the documentation on Optional Types, чтобы ознакомиться с их использованием. Линии как:

cell.backgroundColor = UIColor.clearColor() 

должно быть:

cell!.backgroundColor = UIColor.clearColor() 

или:

if let someCell = cell { 
    someCell.backgroundColor = UIColor.clearColor() 
} 

Вы бы использовать первый вид разворачивая в том случае, когда вы знаете, что экземпляр не nil, как сразу после вашего nil проверьте, есть ли инструкция. Вы бы использовали второй вид разворачивания, если вы не знаете наверняка, что это не nil.

+0

HI, если добавить ячейку! .backgroundColor = UIColor.clearColor() Я по-прежнему получаю ту же ошибку. Если я добавлю (когда будет предложено Xcode) ячейка !!. BackgroundColor = UIColor.clearColor() он работает, это возможно - ячейка !!. Назад .. – dancingbush

+0

изменил начальное назначение на это и теперь ок сейчас: var cell: UITableViewCell ? = tableView.dequeueReusableCellWithIdentifier (идентификатор как String) как UITableViewCell !; – dancingbush

+1

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

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