2017-01-12 11 views
2

Ich habe ein eigenes Unternehmen Objekt wie folgt aufgebaut:einer benutzerdefinierten Objektdaten Lesen einer Tabellenansicht aufzufüllen

class Company: NSObject { 

var companyName: String 
var companyLogo: String 
var stockPrice: String 
init(companyName:String, companyLogo:String, stockPrice:String) { 
self.companyName = companyName 
self.companyLogo = companyLogo 
self.stockPrice = stockPrice 
} 
} 

Und ich gebe jeder wie folgt seine Eigenschaften Objekt:

func companyList() -> [Company] { 
let apple = Company(companyName: "Apple", companyLogo: "AppleLogo", stockPrice: prices[0]) 
let google = Company(companyName: "Google", companyLogo: "GoogleLogo", stockPrice: prices[1]) 
let twitter = Company(companyName: "Twitter", companyLogo: "TwitterLogo", stockPrice: prices[2]) 
let tesla = Company(companyName: "Tesla", companyLogo: "TeslaLogo", stockPrice: prices[3]) 
let samsung = Company(companyName: "Samsung", companyLogo: "SamsungLogo", stockPrice: prices[4]) 

return [apple, google, twitter, tesla, samsung] 
} 

I Möchte man die Namen eines TableViews mit den Daten des Company-Objekts füllen - zum Beispiel möchte ich die Labels der Tabellenansicht so einstellen, dass alle Firmennamen gelesen werden - mit einem fest codierten Array von Firmennamen-Strings (also nicht als Objekt) so einfach ist :

cell.textLabel.text = companyNames[indexPath.row] 

Wie kann ich jetzt dasselbe tun, wenn ich ein Firmenobjekt habe?

Antwort

0

Es klingt, als ob Sie ein Array (Firmen) in ein anderes Array (Firmennamen) konvertieren möchten. Dies ist eine gute Verwendung für map:

let companyNames = companyList().map({ $0.companyName }) 
cell.textLabel.text = companyNames[indexPath.row] 

Alternativ können Sie sich die richtige Firma bekommen, dann seinen Namen:

cell.textLabel.text = companyList()[indexPath.row].companyName 

, die keine Zwischen Array benötigt, so würde ich schlagen Sie die 2. Wahl vor.

+0

Dank Connor nicht ausreicht ... Ich habe beide ausprobiert und habe Index-Out-of-Range-Abstürze bekommen, ich bin mir nicht ganz sicher, wo das Problem liegt, aber es könnte mein Preis-Array sein, da das auf die Aktienkurse warten muss. – d0xi45

+0

Das ist fast sicher die Ursache. Wenn Sie Objekte von einem Ort abrufen, müssen Sie warten, bis dieser Aufruf zum Laden Ihrer Tabelle abgeschlossen ist. – Connor

+0

Wäre es nicht möglich, cell.textLabel.text in den Completion-Handler für den Aktienkurs-Fetcher zu setzen? Ich habe genau das versucht und immer noch den gleichen Fehler. – d0xi45

0

Sie berücksichtigen sollten, eine UITableViewCell Unterklasse erstellen, die Company Eigenschaft nimmt ...

CompanyCell: UITableViewCell { 

    var company: Company { 
     didSet { 
      textLabel.txt = company.companyName 
     } 
    } 
} 

Dann in Ihrem View-Controller,

cell.company = companies[indexPath.row] 
0
  • fügen Sie ein Objekt zur Ihrer View-Controller var companies: [Company]!
  • bevöl die Eigenschaft, wenn neue Daten über Unternehmen verfügbar werden companies = companyList()
  • wenn für die Anzahl der Zeilen in tableView(_:numberOfRowsInSection:) aufgefordert, zurückzukehren companies.count
  • setzten die cell.textLabel.text = companies[indexPath.row].companyName und anderen Werte in tableView(_:cellForRowAt:)
  • benutzerdefinierte Zelle erstellen, wenn der Standard mit 2 Etikett und und Bild nicht
+0

Ok, also habe ich die Eigenschaft an der Spitze des View-Controllers hinzugefügt, puts companies = companyList() in viewDidLoad (das ist der Schritt, bei dem ich unsicher bin, mit mir bin ich ziemlich neu), setze die Anzahl der Zeilen auf companies.count und legen Sie dann die Textbeschriftungen fest. Ich habe einen Fehler: gespeicherte Eigenschaft "Firmen" ohne Anfangswert verhindert synthetisierte Initialisierer – d0xi45

+0

Hinzufügen zu ViewDidLoad ist in Ordnung. Ich vermute, als in der realen Welt App werden Sie es regelmäßig oder auf Anfrage aus dem Internet aktualisieren möchten, so dass Sie einige andere Logik hinzufügen müssen, um das zu berücksichtigen. Soweit die Fehlermeldung - Sie müssen die Eigenschaft in init initialisieren.Da Sie es in viewDidLoad initialisieren, das später als init aufgerufen wird, machen Sie es optional. Siehe die aktualisierte Antwort. – MirekE

Verwandte Themen