2016-06-05 13 views
-3

Ich erstelle eine App, in der benutzerdefinierte Zellen verwendet werden. Ich habe auch diese UITextView, wo, wenn Sie ein Wort eingeben, sollte dieses Wort dann zu einem der vier Etiketten gehen, die ich in der benutzerdefinierten Zelle erstellt habe. Ich bin immer noch dabei, es zu kodieren, aber ich habe einen Fehler bekommen, der "Error: Index Out of Range" sagt. HierFehler: Index außerhalb des gültigen Bereichs UITableView

ist der Code, und ich auch kommentiert, wo es diesen Fehler geben

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> 
    UITableViewCell{ 

     let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as! TableView 

     cell.lbl.text = todolist[indexPath.row] 
     cell.lbl2.text = todolist2[indexPath.row] // This is the error code 
     cell.lbl3.text = todolist3[indexPath.row] 
     cell.lbl4.text = todolist4[indexPath.row] 

     return cell 
} 

Hier ist, wo ich meine Texte anhängen

@IBAction func ClickedforSelection(sender: AnyObject) { 

    todolist.append(txt.text!) 
    todolist2.append(txt1.text!) 
    todolist3.append(txt2.text!) 
    todolist4.append(txt3.text!) 

    self.view.endEditing(true) 
    txt.text = "" 
    txt1.text = "" 
    txt2.text = "" 
    txt3.text = "" 


    NSUserDefaults.standardUserDefaults().setObject(todolist, forKey: "list") 
    NSUserDefaults.standardUserDefaults().setObject(todolist2, forKey: "list2") 
    NSUserDefaults.standardUserDefaults().setObject(todolist3, forKey: "list3") 
    NSUserDefaults.standardUserDefaults().setObject(todolist4, forKey: "list4") 

Hier ist meine numberOfRowsInSection

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int{ 


     return todolist.count 

} 

Ich habe eine Vermutung, dass es die Wiederverwendung von indexPath.row sein kann. Irgendeine Lösungsmöglichkeit?

+0

Post Andere DataSource-Methoden und wie Sie den Text anhängen wird hilfreich sein. – antonio081014

+0

Sicher, bitte überprüfen Sie die Bearbeitung –

+0

Bis jetzt kein Problem zu sehen. Wahrscheinlich könnten Sie den Haltepunkt jedes Mal setzen, wenn Sie versuchen, cell.lbl * .text zu setzen. – antonio081014

Antwort

1

Wenn numberOfRowsInSection todolist.count zurückgibt, greifen Sie auf todolist2 in Ihrer Zelle zu. Wenn Todolist 2 Elemente hat und todolist2 1 Element hat, wird dies ausgeführt, weil Sie versuchen, auf ein Element in einer Liste zuzugreifen, die nicht existiert. Setzen Sie beim ersten Aufruf von cell.lbl.text einen Haltepunkt und überprüfen Sie jedes Array (todolist, todolist1, etc ...). Sie sollten sehen, dass todolist2 keinen Eintrag in der "Zeile" hat, die er aufruft. Wenn dies der Fall ist, sollten Sie es nur testen, bevor Sie es aufrufen. (Überprüfen Sie, ob todolist2.count genügend Elemente enthält - oder noch besser: Ändern Sie den Code so, dass keine 4 Arrays eine Zeile verfolgen (in eine Struktur eines Typs mit allen 4 Werten oder etwas Ähnlichem konvertieren).

ändern sie den folgenden Code durch Linien Kommentierung aus:

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> 
    UITableViewCell{ 

     let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as! TableView 

     cell.lbl.text = todolist[indexPath.row] 
    //  cell.lbl2.text = todolist2[indexPath.row] // This is the error code 
    //  cell.lbl3.text = todolist3[indexPath.row] 
    //  cell.lbl4.text = todolist4[indexPath.row] 

     return cell 
} 

und Test vorhandenen Code zu überprüfen (sollte aber natürlich arbeiten, es wird nicht die Etiketten aktualisieren.) Dann Code hinzufügen, die Anzahl der Elemente in jedem Array drucken:

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> 
    UITableViewCell{ 

     let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as! TableView 

     cell.lbl.text = todolist[indexPath.row] 
    //  cell.lbl2.text = todolist2[indexPath.row] // This is the error code 
    //  cell.lbl3.text = todolist3[indexPath.row] 
    //  cell.lbl4.text = todolist4[indexPath.row] 

    print("Row: \(indexPath.row)") 
    print("List 1: \(todolist.count)") //this will print to the console 
    print("List 2: \(todolist2.count)") 
    print("List 3: \(todolist3.count)") 
    print("List 4: \(todolist4.count)") 

     return cell 
} 

Was Sie wird wahrscheinlich sehen, dass sie nicht die gleiche Anzahl von Elementen haben, und sobald es eine "Zeile" ist, die gleich oder größer als die Anzahl der Elemente ist, wird es brechen. Denken Sie daran, dass der Start der Zeile bei Null beginnt, während die Zählung bei 1 beginnt.

Wenn dies ist, was Sie finden, gibt es ein Problem mit dem Code, wo Sie die Werte zu den Todolist-Arrays hinzufügen. Wenn Sie sehen möchten, wie Sie das in eine Struktur konvertieren, kann ich das für Sie veröffentlichen.

Converting

Der Code Struktur, die ausgeführt wird, wenn etwas angeklickt wird:

@IBAction func ClickedforSelection(sender: AnyObject) { 

zeigt, dass ein Wert jedes Mal zu jedem der 4 todolists geschrieben. Während ich nicht die vollen Anforderungen habe, wenn Sie das möchten, können Sie eine Struktur implementieren. Setzen Sie diesen Code in eine eigene ToDoList.swift-Datei (im Idealfall):

struct ToDoListItem { 
    var listItem: String? 
    var list1Item: String? 
    var list2Item: String? 
    var list3Item: String? 
} 

Dann ersetzen Sie, wo Sie Ihre todolislt Arrays (alle 4 von ihnen) mit einem einzigen definieren:

var listItems = [ToDoListItem]() //creates an array of ToDoListItems and initializes it with no values 

Dann in der ClickedForSelection Funktion, ändern Sie ihn auf:

let listItem = ToDoListItem(listItem: txt.text, list1Item: txt1.text, list2Item: txt2.text, list3Item: txt3.text) 
listItems.append(listItem) //add it to your array 

//todolist.append(txt.text!) 
//todolist2.append(txt1.text!) 
//todolist3.append(txt2.text!) 
//todolist4.append(txt3.text!) 

self.view.endEditing(true) 
txt.text = "" 
txt1.text = "" 
txt2.text = "" 
txt3.text = "" 

// This routine will need to be updated. Leaving that for you to figure out :) 
// NSUserDefaults.standardUserDefaults().setObject(todolist, forKey: "list") 
// NSUserDefaults.standardUserDefaults().setObject(todolist2, forKey: "list2") 
// NSUserDefaults.standardUserDefaults().setObject(todolist3, forKey: "list3") 
// NSUserDefaults.standardUserDefaults().setObject(todolist4, forKey: "list4") 

... dann numberOfRowsInSection Änderungen:

return listItems.count 

... dann cellForRowAtIndexPath Änderungen:

let cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as! TableView 

    let listItem = listItems[indexPath.row] 

    cell.lbl.text = listItem.listItem ?? "" // Since listItems.listItem is an optional value, ?? unwraps it safely. If it is nill, it uses "" instead 
    cell.lbl2.text = listItem.list1Item ?? "" 
    cell.lbl3.text = listItem.list2Item ?? "" 
    cell.lbl4.text = listItem.list3Item ?? "" 

    return cell 

wieder ... würde ich dringend überlegen, wie Sie jedes Mal einen Wert für einen todolist für alle 4-Listen zu speichern (wenn es sich um eine To-do-Liste App ist, es scheint, dass dies nicht ideal sein kann?)

+0

Todolist sowie todolist2 haben 1 artikel. Ich habe das Gefühl, dass ich den "IndexPath.row" Teil zu etwas anderem ändern muss. Ich habe keine Ahnung, wie ich das machen soll. –

+0

Fügen Sie Code zu 'cellForRowAtIndexPath' hinzu, um' indexPath.row', 'todoList.count' und' todoList2.count' zu drucken. Es sollte dir einen Hinweis geben. Der 'cellForRowAtIndexPath' wird für jede angezeigte Zeile aufgerufen, so dass Sie den Anruf erfassen müssen, der tatsächlich fehlschlägt ... – MirekE

+0

Können Sie eingeben, was genau ich tun soll? –

Verwandte Themen