2016-05-24 2 views
1

У меня есть ссылка из трех UILabels в ячейке таблицы для пользовательского класса, который является отдельным файлом из моего VC (View Controller). listOfTasks - словарь с кортежами внутри. Вот соответствующий код:Почему мой UILabel nil?

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

    let (name,description,date) = listOfTasks[indexPath.row] 
    cell.title.text = name //Here I get the error: "fatal error: unexpectedly found nil while unwrapping an Optional value" 
    cell.subtitle.text = description 
    cell.date.text = date 

    return cell 
} 

Почему это дает мне эту ошибку?

Я уже проверял свои подключения.

P.S. Для человека, думающего, что это дубликат this, ответ на этот вопрос не решает мою проблему.

EDIT: Код для MyCustomTableViewCell:

import UIKit 

class MyCustomTableViewCell: UITableViewCell { 
    @IBOutlet weak var title: UILabel! 
    @IBOutlet weak var subtitle: UILabel! 
    @IBOutlet weak var date: UILabel! 
} 

Переменные:

cell.title: nil

cell.subtitle: nil

cell.date: nil

EDIT 2: Скриншот FirstViewController:

enter image description here

EDIT 3: Может быть, я не проверял мои связи достаточно тщательно. Нормально ли для кругов быть пустым в классе? См. EDIT 7.

EDIT 4: Я получаю ту же ошибку, когда я пытаюсь присвоить ей значение .text, независимо от того, где. Я пытался сделать это в классе, с которым я связан; такая же ошибка.

РЕДАКТИРОВАТЬ 5: Не похоже, что у меня слабое соединение; сильный все еще дает мне ошибку.

enter image description here

EDIT 6: Я uploaded my project files to GitHub для тех, кто заинтересован в поиске на них.

EDIT 7: Управлен для правильной работы @IBOutlet.

+0

Вы говорите, что вы проверили соединения, но вы не говорите, как это сделать. Я предлагаю поставить точку останова на строке, которая дает вам ошибку и проверяет значения cell, cell.title и остальных точек. –

+0

Можете ли вы показать свой код для 'MyCustomTableViewCell'? –

+0

@ YuchenZhong Отредактировано. – atirit

ответ

0

Когда я в последний раз сделал пользовательский TableViewCell класс, я должен был добавить такой код:

init(style: UITableViewCellStyle, reuseIdentifier: String) { 
    super.init(style: style, reuseIdentifier: reuseIdentifier) 
} 

override func awakeFromNib() { 
    super.awakeFromNib() 
} 

override func setSelected(selected: Bool, animated: Bool) { 
    super.setSelected(selected, animated: animated) 
} 

required init?(coder aDecoder: NSCoder) { 
    super.init(coder: aDecoder) 
} 

Вы реализации всех необходимых методов для UITableViewCell?

+0

Если я вставляю свой код, он дает мне ошибку, говоря, что я уже сделал это, так что да. Спасибо за ответ btw :) – atirit

+0

Что вы получаете, если вы печатаете (listOfTasks [indexPath.row]) –

+0

'(« Pie »,« Cheese »,« 12:00 »)' (Это то, что предопределено мной .) – atirit

1

Я думаю, вы должны удалить этот код, если он существует:

self.tableView.registerClass(TableViewCell.self, forCellReuseIdentifier: "Cell") 
+0

Если я удалю этот код, я получаю сообщение об ошибке: 'этот класс не является ключевым значением, совместимым с кодировкой для ключевой даты. ' – atirit

+0

Это означает, что метка даты подключается к вызову IBOutlet' date ', но не выходит в класс ячейки , Из вашего кода кажется, что ничего не пропало. Я не могу воспроизвести эту проблему ... Или вы могли бы попытаться повторно подключить IBOutlet в построителе интерфейса? –

+0

Эта ошибка появляется, если я удаляю 'self.tableView.registerClass (TableViewCell.self, forCellReuseIdentifier:" Cell ")'. Он уходит, если я его добавлю. Вы говорите, что я должен удалить эту строку, а затем попытаться разрешить возникшую ошибку другим способом?Кроме того, я попытался переподключить все; Я получаю мою первоначальную ошибку. – atirit

1
In `MyCustomTableViewCell`,you can change your label property weak to strong 
Only this change is required.My code will help you. 

enter image description here

var listOfTasks : [(String,String,String)] = [] объявить переменную как глобальную

listOfTasks = [ ("Hey There","Welcome","12:00"), ("Hi","Hello","1:00") ] 

чем этот line.this код работающ отлично.

+0

Это, похоже, не имеет значения. Я все еще получаю сообщение об ошибке. – atirit

+0

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

+0

Я обновлю вопрос другим изображением. – atirit

1

Щелкните по двум переплетенным кружкам в правом верхнем углу XCode. Это разбивает экран на два. Убедитесь, что одна сторона - это раскадровка, а другая - пользовательский подкласс UITableViewCell. Затем нажмите + удержать и перетащить из каждого пустого круга в правильные виды (так что для ярлыка убедитесь, что он подключен к предполагаемой метке.)

Прежде чем это сделать, вы можете также очистить все существующие соединения в ячейке. Сделайте это в раскадровке, удерживайте shift и щелкните правой кнопкой мыши на ячейке в таблицеView. Убедитесь, что вы выбрали ячейку из раскрывающегося списка. Затем нажмите на стрелку с кругом вокруг нее в правом верхнем углу экрана. Это покажет вам существующие соединения на выходе. Просто нажмите x рядом с любыми существующими, чтобы у вас не было никаких «зонтов зомби».

+0

Когда я пытаюсь перетащить с моей метки на мой класс, я получаю синюю линию, чтобы соединить их, но когда я бросаю ее в класс, ничего не происходит. – atirit

+0

Перетащите из пустой точки (той, которая соответствует переменной типа UILabel) на метку. Это щелчок левой кнопкой мыши и удерживание. – AppreciateIt

+0

Все еще ничего не происходит. Это ошибка? – atirit