2016-04-09 8 views
0

Mein zufälliger Versuch ruft cellForRowAtIndexPath nicht an. Ich nehme an, mein Setup stimmt nicht.Was ist der beste Weg, um ein UITableView in einer UITableView-Zelle zu laden?

Wenn ich dies ausführen, wird meine ViewDidLoad() aufgerufen. Aber nichts lädt wirklich. Wenn ich die Debug-Ansichtshierarchie betrachte, kann ich sehen, dass nichts hinzugefügt wurde. Ich nehme also an, dass mir etwas an der Instanziierung dieses TableView fehlt.

Als Referenz ist dies meine UITableView. Aber um ehrlich zu sein, ich bin völlig ratlos darüber, was genau ein UITableView benötigt, um instanziiert zu werden. Und dies würde mein bester Versuch sein:

class WordTableView: UITableView { 

    var words = [Word]() 

    func viewDidLoad() { 
     self.registerNib(UINib(nibName: "WordCell", bundle: nil), forCellReuseIdentifier: "wordCell") 
    } 

    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     return words.count 
    } 

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

     let word = words[indexPath.row] 
     cell.sanskrit.text = "Sanskrit" //word.valueForKey("sanskrit") 
     cell.definition.text = "Definition" // word.valueForKey("definition") 

     return cell 
    } 
} 
+0

Frage - warum sind Sie in den Zellen einer anderen Tabellenansicht eine Tabellenansicht setzen? Wäre es nicht einfacher, die Haupttabelle zu trennen? Und es ist wirklich verwirrend, eine Methode mit dem Namen 'viewDidLoad' in eine Nicht-View-Controller-Klasse einzufügen. – rmaddy

+0

@rmaddy Yah, danke für die Nachfrage. Es ist eine dynamische geordnete Liste, die ich aufzudecken versuche. Also zuvor habe ich versucht, es mit UILabels und UIViews zu machen, aber weil es alles dynamisch und meistens programmatisch ist, wurde es zur Hölle für mein newb self, ich dachte .. warum nicht einfach ein xib machen, und ein UITableView um a anzuzeigen Liste. Was denken Sie? – Trip

+1

Wenn ich Sie wäre, würde ich einfach mehr Zeilen und/oder Abschnitte zur Haupttabelle hinzufügen. Geschachtelte Tabellenansichten können alle Arten von Problemen mit Scroll- und Berührungsereignissen verursachen. – rmaddy

Antwort

1

Sie setzen wordTableView Datenquelle und delegieren an die Setter-Klasse, so Tabellenansicht Datenquelle und Delegatfunktion nicht in WordTableView Klasse aufgerufen werden.
Da Sie gesagt haben, dass Ihre viewDidLoad aufgerufen wird, lassen Sie den Delegaten in dieser Funktion festlegen.

let wordTableView = WordTableView(frame: CGRectZero) 
wordTableView.words = words 
let currentCell = wordTableView.cellForRowAtIndexPath(indexPath) 
cell.contentView.addSubview(wordTableView) 
wordTableView.viewDidLoad() 
wordTableView.reloadData() 

Und WordTableView Klasse

class WordTableView: UITableView, UITableViewDelegate, UITableViewDataSource { 

    var words = [Word]() 

    func viewDidLoad() { 
     self.registerNib(UINib(nibName: "WordCell", bundle: nil), forCellReuseIdentifier: "wordCell") 
     self.delegate = self 
     self.dataSource = self 
    } 

    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     return words.count 
    } 

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

     let word = words[indexPath.row] 
     cell.sanskrit.text = "Sanskrit" //word.valueForKey("sanskrit") 
     cell.definition.text = "Definition" // word.valueForKey("definition") 

     return cell 
    } 
} 

Als Randbemerkung, sollten Sie viewDidLoad() nicht direkt aufrufen und es ist besser, wenn Sie WordTableView erben UIViewController und legen Sie Ihre Tabellenansicht hinein machen.

1

Ich denke, dass Ihre ViewDidLoad aufgerufen wird, weil Sie dies explizit tun, aber Ihr Frame ist CGRectZero, also hat es technisch keine Größe, also gibt es nichts als subView hinzufügen, so dass nichts aufgerufen wird.

Ich denke, ein besserer Weg zur Initialisierung der Tabellenansicht besteht darin, einen eigenen Initialisierer zu erstellen, z.

class WordTableView: UITableView { 

var words = [Word]() 

init(frame: CGRect, wordArray: [Word], delegate: UITableViewDelegate, dataSource: UITableViewDataSource) { 
    self.frame = frame 
    words = wordArray 
    self.delegate = delegate 
    self.dataSource = dataSource 
    self.reloadData() 
} 

func viewDidLoad() { 
    self.registerNib(UINib(nibName: "WordCell", bundle: nil), forCellReuseIdentifier: "wordCell") 
} 

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    return words.count 
} 

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

    let word = words[indexPath.row] 
    cell.sanskrit.text = "Sanskrit" //word.valueForKey("sanskrit") 
    cell.definition.text = "Definition" // word.valueForKey("definition") 

    return cell 
} 

}

Und dann in Ihrem Setup:

let wordTableView = WordTableView(frame: cell.contentView.bounds, wordArray: words, delegate: self, dataSource: self) 
let currentCell = wordTableView.cellForRowAtIndexPath(indexPath) 
cell.contentView.addSubview(wordTableView) 
cell.setNeedsDisplay() 
Verwandte Themen