2016-05-08 4 views
0
struct Games { 
    var GameName  : String 
    var GameCheats  : [Cheats] 
} 

struct Cheats { 
    var CheatName   : String 
    var CheatCode   : String 
    var CheatDescription : String 
} 

let COD4 = Games(GameName: "Name", GameCheats: [Cheats(CheatName: "Cheat", CheatCode: "Code", CheatDescription: "Description")]) 

Der obige Code ist, was ich derzeit in einer schnellen Datei innerhalb meines Testprojekts habe. Ich bin jetzt Werte zu nehmen von oben versucht, eine Tableview zu füllen, siehe unten:PopulateTableView über Structs & Arrays

class GamesListViewController: UITableViewController { 

    var ArrayOfGames = [COD4] 

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

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

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

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

    override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
     let cell = self.tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) 
     cell.textLabel?.text = ArrayOfGames[indexPath.row] 
     return cell 
    } 

} 

Aber ich einen Fehler erhalte: ‚String‘ "Can not Typen Wert‚Game‘zuweisen eingeben "

: Ich bin zu schnellen aber tun Erfahrung in PHP, ich bin zu kämpfen ernsthaft mein Wissen über :(

ich jede Hilfe dankbar zu übertragen.

Herzlichst Rory

Antwort

1

Cell textLabel?.text ist vom Typ String Sie versuchen, eine Game ihm zuweisen.

cell.textLabel?.text = ArrayOfGames[indexPath.row] 

Sie müssen eine Zeichenfolge aus Ihrem Objekt Game erstellen und Ihr Spiel beschreiben. Die einfachste Lösung wäre name zu verwenden:

cell.textLabel?.text = ArrayOfGames[indexPath.row].GameName 

Dieses kompilieren würde und ausführen. Das Label der Zelle würde dem Namen Ihres Spiels entsprechen.

Eine interessante Beschreibung kann mit einer Liste von Cheats gebildet werden:

let cheatList = ArrayOfGames[indexPath.row] 
    .GameCheats 
    .map { "\($0.CheatName): \($0.CheatCode) \($0.CheatDescription)" } 
    .joinWithSeparator(", ") 
cell.textLabel?.text = "\(ArrayOfGames[indexPath.row].GameName) \(cheatList)" 
+0

Die Liste der Cheats Beschreibung ist sehr interessant! Ich werde diesen Code für zukünftige Referenz sicher behalten. Danke für die Hilfe. Wenn ich noch eine Frage stellen könnte? Wie würde ich Cheat-Informationen an eine neue Tabellenansicht weitergeben, die für das Eltern-Spiel relevant ist? Ich werde mich auf die Vorbereitung vorbereiten und alles fertig machen, ich muss nur wissen, wie ich die Daten weitergeben kann. Sorry für alle Fragen. Mit freundlichen Grüßen Rory – user1263909

+0

@ user1263909 In der Vorbereitung für den Übergang haben Sie Zugriff auf die Zeile, auf die der Benutzer geklickt hat. Benutze die Zeile, um 'ArrayOfGames [selectedRow]' 'Game'-Objekt zu erhalten. Sie haben auch Zugriff auf den View Controller "Details". Erstelle eine Variable "currentGame: Game" im Detail-Controller und setze sie als Vorbereitung für den Übergang auf das ausgewählte Spiel. – dasblinkenlight

1

ArrayOfGames[indexPath.row] gibt eine Games Struktur. Sie können das nicht der Eigenschaft text eines Labels zuweisen (es erwartet eine String?). Ich nehme an, Sie wollten die GameName -Eigenschaft auf Ihrer Struktur verwenden. Zum Beispiel:

cell.textLabel?.text = ArrayOfGames[indexPath.row].GameName 

Aber noch wichtiger, sollten Sie darüber nachdenken, Ihre Namen neu zu denken. Ein paar Konventionen, die Sie sollten folgen, sind:

  • Property & Methodennamen mit einem Kleinbuchstaben beginnen soll, und folgen camelCase

  • Klasse, Struktur Enum & Protokollnamen mit einem Großbuchstaben beginnen sollte und follow CamelCase

  • Klassen- und Strukturnamen sollten Singular sein, es sei denn sie repräsentieren tatsächlich etwas Plural (dh nicht Games, wenn es nur ein einzelnes Spiel darstellt)

  • Sie sollten es vermeiden, den Namen Ihrer Struktur in seinen Eigenschaften (dh gameName in Ihrem Game struct)

  • Sie Wiederholung vermeiden sollte die Art einer Immobilie in ihrem Namen zu wiederholen, wenn es bereits eine klare Bedeutung hat (ich.e games, nicht arrayOfGames)

würde Deshalb suchen eine konventionellere Benennungssystem für Ihren Code wie folgt aus:

struct Game { 
    var name : String 
    var cheats : [Cheat] 
} 

struct Cheat { 
    var name : String 
    var code : String 
    var description : String 
} 


class GamesListViewController: UITableViewController { 

    var games = [game1, game2, game3, ... gameN] 

    ... 


    cell.textLabel?.text = games[indexPath.row].name 

Ray Wenderlich has a pretty nice Swift style guide, die ich Ihnen auf einen Blick empfehlen würde.

+0

Danke, dass Sie mich über die konventionelleren Wege informiert haben! Es funktioniert perfekt, ich kann nicht glauben, dass es so einfach war wie das Hinzufügen von .name zu indexpath.row lol. Wenn ich noch eine Frage stellen könnte? Wie würde ich Cheat-Informationen an eine neue Tabellenansicht weitergeben, die für das Eltern-Spiel relevant ist? Ich werde Vorbereitung für den Übergang und alles bereit, ich muss nur wissen, wie man die Daten weitergeben .. Sorry für alle Fragen. Mit freundlichen Grüßen Rory – user1263909

+0

@ user1263909 Hallo Rory, glücklich zu helfen. Ich bin mir nicht ganz sicher, woran Sie Probleme haben, wenn Sie Ihre Daten an einen neuen View-Controller übergeben - 'preparedForSegue' ist definitiv der richtige Weg. Ich rate davon ab, zwei Fragen in einem Beitrag zusammenzufassen, also würde ich vorschlagen, dass Sie eine neue Frage dazu stellen. Obwohl es bereits [eine Menge Fragen zu diesem Thema] gibt (https://www.google.co.uk/webhp?sourceid=chrome-instant&ion=1&espv=2&ie=UTF-8#q=swift%20passing%20data % 20between% 20view% 20controllers% 20Site% 3Astackoverflow.com), also stellen Sie sicher, Ihre Forschung zu tun, bevor Sie fragen! – Hamish

+0

Danke, ich werde Ihren Rat nehmen und zuerst schnüffeln. Wenn ich die Antwort nicht finde, erstelle ich eine neue Frage und füge den Link hier ein, um die Dinge einfacher zu machen. Danke wieder – user1263909