2016-10-13 3 views
0

Ich bin neu in iOS. Doing-Projekt durch Anschauen von Tutorial, das mit Swift 2 geschrieben wurde.
Es funktioniert, wenn der Autor App, aber nicht in meinem Fall läuft.Swift 3: Index außerhalb des Bereichs Fehler

Viewcontroller:

var books = [[String: AnyObject]]() 

override func viewDidLoad() { 
    super.viewDidLoad() 

    tableView.dataSource = self 
    searchBar.delegate = self 
} 

Und die Erweiterung

extension ViewController: UITableViewDataSource { 

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     return 1 
    } 

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
     let cell = tableView.dequeueReusableCell(withIdentifier: "BookCell", for: indexPath) 

     // error on this line 
     if let volumeInfo = self.books[indexPath.row]["volumeInfo"] as? [String: AnyObject] { 
      cell.textLabel?.text = volumeInfo["title"] as? String 
      cell.detailTextLabel?.text = volumeInfo["subtitle"] as? String 
     } 

     return cell 
    } 
} 

Die Konsolenausgabe:

enter image description here

Bitte, mir helfen zu erkennen, was die Ursache ist.

+2

Doubt es etwas mit Swift zu tun hat 3 vs 2. Ihr 'books' Array wahrscheinlich leer ist (oder zumindest' indexPath.section > = books.count'). Überprüfen Sie, was sich in 'indexPath' und' books' befindet, und vergewissern Sie sich, dass kein Teil des Codes fehlt, in dem das 'books'-Array initialisiert wurde. – shim

+1

Was geben Sie in 'numberOfRowsInSection' zurück? Das 'Bücher'-Array ist offensichtlich leer. – vadian

Antwort

2

Sie haben books.count von numberOfRowsInSection zurückzukehren, nie "hard-Code", dass Wert, wenn Es bezieht sich auf das Datenquellenarray.

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

PS: In Swift 3 Sie [String:Any] verwenden sollten, anstatt [String:AnyObject]

+0

Vielen Dank! Es löste das Problem. – Marat

2

Ich nehme viel von Ihrem Projekt an, aber wenn Sie nur einen Abschnitt in Ihrem TableView haben, der der Standard ist, sollten Sie indexPath.section nicht für Ihr Bücherwörterbuch verwenden. Sie sollten indexPath.row verwenden, wie unten

ändern gesehen -

if let volumeInfo = self.books[indexPath.section]["volumeInfo"] as? [String: AnyObject] 

To -

if let volumeInfo = self.books[indexPath.row]["volumeInfo"] as? [String: AnyObject] { 
+0

Oh, sorry :(Es war eine der Versuche, das Problem zu lösen. Eigentlich ist es ein .row. Sorry wieder – Marat

+0

Das sollte immer noch nicht zusammenbrechen, da sie mindestens so viele Reihen sein müssen wie es Abschnitte gibt. –

+0

Keine Sorge, ich bin ziemlich neu und ich weiß, wie frustrierend es sein kann –

Verwandte Themen