2017-03-11 5 views
0

Ich habe Probleme, cellForRowAt zu arbeiten, aber leider bleibt meine Anwendung leer, nachdem ich sie kompiliert habe. Ich verwende Xcode 8.3 Beta 3.Swift cellForRowAt wird nicht angezeigt

import UIKit 

class myCell: UITableViewCell { 

    @IBOutlet var myLabel: UILabel! 
    @IBOutlet var myImageView: UIImageView! 
    override func awakeFromNib() { 
    super.awakeFromNib() 
    // Initialization code 
} 

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

    // Configure the view for the selected state 
    } 
} 

Ich habe eine Lebensmittelklasse erstellt die Arbeit leichter zu machen:

import Foundation 

class Food { 
var imageName = "" 
var description = "" 
var moreInfo = "" 

init(imageName: String, description: String, moreInfo: String) { 
    self.imageName = imageName 
    self.description = description 
    self.moreInfo = moreInfo 
    } 
} 

Und schließlich ist dies die Tableviewcontroller:

import UIKit 

class TableViewController: UITableViewController { 

    var foodArray: [Food] = [Food]() 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     let food1 = Food(imageName: "cake.jpg", description: "Chocolate Cake", moreInfo: "There is nothing better than a great chocolate cake.") 
     let food2 = Food(imageName: "meringue.jpg", description: "Meringue & Berries", moreInfo: "I really don't like meringue but it's a nice photo.") 
     let food3 = Food(imageName: "peaches.jpg", description: "Grilled Peaches", moreInfo: "This would be perfect as a summer time dessert.") 
     let food4 = Food(imageName: "tiramisu.jpg", description: "Tiramisu", moreInfo: "One of my favorite Italian desserts. Yum.") 

     foodArray.append(food1) 
     foodArray.append(food2) 
     foodArray.append(food3) 
     foodArray.append(food4) 

    } 

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



    override func numberOfSections(in tableView: UITableView) -> Int { 
     return 1 
    } 

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


    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
     let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! myCell 
     let foodItem = foodArray[indexPath.row] 
     cell.myImageView.image = UIImage(named: foodItem.imageName) 
     cell.myLabel.text = foodItem.description 
     self.tableView.reloadData() 
     return cell 
    } 
} 

Kann mir bitte jemand zeigen, was ich falsch gemacht habe?

+0

Ist die Methode feuern? Oder sagst du, dass der gesamte Bildschirm leer ist? Weil letzteres ein anderes Problem ist. – dylanthelion

+0

Die Anwendung ist leer – Virtuoso

+0

Ich würde @reinier Melians Vorschläge nehmen, außer jeden reloadData() -Aufruf vollständig entfernen. Lass mich wissen, ob das funktioniert. reloadData() ruft alle Datenquellenmethoden Ihrer Tabellenansicht auf und Sie können hier eine Schleife haben. Für zukünftige Referenz sollten UI-Updates auch im Hauptthread ausgeführt werden. – dylanthelion

Antwort

1

Sie sollten nicht nennen self.tableView.reloadData() in Ihrem func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell Ihre self.tableView.reloadData()

Ihre viewDidLoad Methode für diesen Code ersetzen

override func viewDidLoad() { 
    super.viewDidLoad() 

    let food1 = Food(imageName: "cake.jpg", description: "Chocolate Cake", moreInfo: "There is nothing better than a great chocolate cake.") 
    let food2 = Food(imageName: "meringue.jpg", description: "Meringue & Berries", moreInfo: "I really don't like meringue but it's a nice photo.") 
    let food3 = Food(imageName: "peaches.jpg", description: "Grilled Peaches", moreInfo: "This would be perfect as a summer time dessert.") 
    let food4 = Food(imageName: "tiramisu.jpg", description: "Tiramisu", moreInfo: "One of my favorite Italian desserts. Yum.") 

    foodArray.append(food1) 
    foodArray.append(food2) 
    foodArray.append(food3) 
    foodArray.append(food4) 
} 

und benutzen Sie diesen Code für Ihre func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell Code

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! myCell 
    let foodItem = foodArray[indexPath.row] 
    cell.myImageView.image = UIImage(named: foodItem.imageName) 
    cell.myLabel.text = foodItem.description 
    return cell 
    } 

ich diese Hoffnung hilft Ihnen

+1

Es gibt keinen Grund, reloadData() in viewDidLoad() aufzurufen (Datenquellenmethoden werden nach ViewWillAppear aufgerufen, glaube ich). Guter Fang beim Aufruf von reloadData() in cellForRowAtIndexPath jedoch. – dylanthelion

+0

Immer noch nicht funktioniert ... – Virtuoso

+0

@Virtuoso war Modulname Problem dann ?, noch sollten Sie reloadData() in cellForRowAtIndexPath nicht aufrufen –

0

Das Problem ist, dass Sie reloadData() so sind aufrufen, dies zu beheben, entfernen Sie es aus dem Code:

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! myCell 
    let foodItem = foodArray[indexPath.row] 
    cell.myImageView.image = UIImage(named: foodItem.imageName) 
    cell.myLabel.text = foodItem.description 

    return cell 
} 
0

Sie müssen die Klasse registrieren und eine Wiederverwendung Kennung mit der Methode hinzufügen:

Tableview. register (UITableViewCell.self, forCellReuseIdentifier: "Cell")

Fügen Sie diese Methode in viewDidLoad

auch brauchen Sie nicht self.tableView.reloadData() innerhalb cellForRowAtIndex anrufen Pfadmethode

Hoffe es hilft

Verwandte Themen