2014-10-16 1 views
5

Я не могу понять, почему эта пользовательская ячейка не выводится.
Swift: IBoutlets нуль в пользовательской ячейке

У меня есть настраиваемая ячейка, установленная в раскадровке (без наконечника). У меня есть текстовое поле и 2 метки, которые являются ничтожными, когда я пытаюсь получить к ним доступ в пользовательском классе ячейки. Я почти уверен, что все правильно подключено, но все равно получаю нуль.

Я выбрал мою ячейку таблицы в раскадровке и установить пользовательский класс для TimesheetTableViewCell Я также контроль нажал на стол и установить источник данных и делегат быть TimesheetViewController

Мой пользовательский класс клеток:

import UIKit 

class TimesheetTableViewCell: UITableViewCell { 

@IBOutlet var duration: UITextField! 
@IBOutlet var taskName: UILabel! 
@IBOutlet var taskNotes: UILabel! 

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

override init?(style: UITableViewCellStyle, reuseIdentifier: String!) { 
    super.init(style: style, reuseIdentifier: reuseIdentifier) 
    println("Cell's initialised")// I see this 
    println(reuseIdentifier)// prints TimesheetCell 
} 


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

func setCell(duration: String, taskName: String, taskNotes: String){ 
    println("setCell called") 
    self.duration?.text = duration 
    self.taskName?.text = taskName 
    self.taskNotes?.text = taskNotes 
} 

Мой контроллер:

class TimesheetViewController: UIViewController, UITableViewDataSource, UITableViewDelegate{ 

@IBOutlet var timesheetTable: UITableView! 

var items = ["Item 1", "Item2", "Item3", "Item4"] 

override func viewDidLoad() { 
    super.viewDidLoad() 
    self.timesheetTable.registerClass(TimesheetTableViewCell.self, forCellReuseIdentifier: "TimesheetCell") 

} 
    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
     let cell = tableView.dequeueReusableCellWithIdentifier("TimesheetCell", forIndexPath: indexPath) as TimesheetTableViewCell 
     println(items[indexPath.row]) // prints corresponding item 
     println(cell.duration?.text) // prints nil 
     cell.setCell(items[indexPath.row], taskName: items[indexPath.row], taskNotes: items[indexPath.row]) 
     return cell 
} 
+1

вместо 'self.timesheetTable.registerClass (...)': использовать 'self.timesheetTable.registerNib (...)', возможно ...? – holex

ответ

31

Проблема эта линия:

self.timesheetTable.registerClass(TimesheetTableViewCell.self, forCellReuseIdentifier: "TimesheetCell") 

Удалить его. В этой строке говорится: «Do не получить ячейку из раскадровки». Но вы do хотите получить ячейку из раскадровки.

(Убедитесь, однако, что идентификатор ячейки в раскадровке "TimesheetCell", или вы будете врезаться.)

+0

Хорошо, что я получил данные ячейки по умолчанию, чтобы отобразиться. Благодаря! Кажется, я все еще не могу получить доступ к ибутлетам, хотя идея? пытаясь self.taskName? .text = "something" в cell.setCell не имеет никакого эффекта, потому что taskName is nil –

+0

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

+0

Ха-ха! Я бы, но я уже пошел и изменил свой код. Я закончил работу снова и создаю nib вместе с пользовательским классом ячеек, затем в моем contoller viewdidload() я назвал этот self.timesheetTable.registerNib (UINib (nibName: «TimesheetTableViewCell», bundle: nil) !, forCellReuseIdentifier: «TimesheetCell «). Я ценю вашу помощь мата, спасибо. –

1

Довольно уверен, что вам нужно удалить строку

self.timesheetTable.registerClass(TimesheetTableViewCell.self, forCellReuseIdentifier: "TimesheetCell") 

из viewDidLoad ().