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?)
Post Andere DataSource-Methoden und wie Sie den Text anhängen wird hilfreich sein. – antonio081014
Sicher, bitte überprüfen Sie die Bearbeitung –
Bis jetzt kein Problem zu sehen. Wahrscheinlich könnten Sie den Haltepunkt jedes Mal setzen, wenn Sie versuchen, cell.lbl * .text zu setzen. – antonio081014