Fatal error: Index out of range

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Fatal error: Index out of range

    Hallo zusammen,

    ich habe eine Tabelle die eigentlich auch sehr gut funktioniert hat. Allerdings habe ich Gestern einmal alle Einträge gelöscht und habe jetzt eine leere Tabelle.
    Wenn ich jetzt allerdings einen neuen Eintrag erstellen will kommt der Error: "Thread 1: Fatal error: Index out of range" ich habe schon versucht den Index mit print befehlen auszulesen und anzupassen aber leider ohne Erfolg.

    Das Problem tritt bei "getEinsatzItem(index: Int)..." auf

    Gruß Yooh

    Shell-Script: CoreDataManager.swift

    1. import UIKit
    2. import CoreData
    3. class CoreDataManager {
    4. static let shared = CoreDataManager()
    5. var einsaetze = [Einsatz]()
    6. // Context als Variable
    7. let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
    8. private init() {
    9. loadItems()
    10. }
    11. func createObj(einsatznummer: String, datum: String, uhrzeit: String, stichwort: String, palst: String) {
    12. let einsatz = NSEntityDescription.insertNewObject(forEntityName: "Einsatz", into: context) as! Einsatz
    13. //Entity.Attribute = variable
    14. einsatz.einsatznummer = einsatznummer
    15. einsatz.datum = datum
    16. einsatz.stichwort = stichwort
    17. einsatz.palst = palst
    18. einsatz.uhrzeit = uhrzeit
    19. saveContext()
    20. }
    21. // Count Array
    22. func getNumberOfItems () -> Int {
    23. return einsaetze.count
    24. }
    25. func getEinsatzItem(index: Int) -> Einsatz {
    26. print(index)
    27. return einsaetze[index]
    28. }
    29. // Löschen eines TodoItems aus der Liste MUSS BEIM AUFRUFEN INVERTIERT WERDEN
    30. func removeEinsatzItemAtIndex(index: Int) {
    31. print (index, "der soll weg")
    32. // Löschen aus dem Context
    33. context.delete(getEinsatzItem(index: index))
    34. // Löschen aus dem Array todoItems
    35. einsaetze.remove(at: index)
    36. // Änderung muss gesichert werden
    37. saveContext()
    38. }
    39. // Test
    40. // Objekte laden
    41. func loadItems () {
    42. let request = NSFetchRequest<Einsatz>(entityName: "Einsatz")
    43. print (request, "das")
    44. do {
    45. einsaetze = try context.fetch(request)
    46. print("geladen")
    47. } catch {
    48. print(error.localizedDescription)
    49. }
    50. }
    51. // Context speichern
    52. func saveContext () {
    53. do {
    54. try context.save()
    55. } catch {
    56. print(error.localizedDescription)
    57. }
    58. }
    59. }
    Alles anzeigen
  • Hallo Mattes,
    danke für die schnelle Antwort, ich habe das File angehängt. Ganz unten in dem File wird die createObj... Methode aufgerufen.

    Jetzt wo du es sagst, habe ich die Variable "help" im Verdacht. Aber diese mit einem festen Wert zu deklarieren hat auch nicht geholfen.
    Yooh

    Shell-Script: NeuerEinsatzViewController.swift

    1. import UIKit
    2. import CoreData
    3. import MapKit
    4. //------------------------------------------Stichworte und RIC----------------------
    5. class alarmierung {
    6. var einsatzstichwort: String
    7. var ric: [String]
    8. init(einsatzstichwort:String, ric:[String]) {
    9. self.ric = ric
    10. self.einsatzstichwort = einsatzstichwort
    11. }
    12. }
    13. //----------------------------------------------------------------------------------
    14. class NeuerEinsatzViewController: UIViewController, UITextFieldDelegate, UIPickerViewDelegate, UIPickerViewDataSource, UISearchBarDelegate {
    15. //----------------------------------------------------------------------------------
    16. // MARK: - Outlet
    17. @IBOutlet weak var einsatznummerTextField: UITextField!
    18. @IBOutlet weak var datePicker: UIDatePicker!
    19. @IBOutlet weak var firstPickerView: UIPickerView!
    20. var stichw = [alarmierung]()
    21. struct GLala {
    22. static var ri = String()
    23. static var einsatzstichwort = String()
    24. }
    25. //Map
    26. @IBOutlet weak var myMapView: MKMapView!
    27. @IBAction func searchButton(_ sender: Any) {
    28. let searchController = UISearchController(searchResultsController: nil)
    29. searchController.searchBar.delegate = self
    30. present(searchController, animated: true, completion: nil)
    31. }
    32. func searchBarSearchButtonClicked(_ searchBar: UISearchBar) {
    33. // Ignore user
    34. UIApplication.shared.beginIgnoringInteractionEvents()
    35. //Activity Indicator
    36. let activityIndicator = UIActivityIndicatorView ()
    37. activityIndicator.style = UIActivityIndicatorView.Style.gray
    38. activityIndicator.center = self.view.center
    39. activityIndicator.hidesWhenStopped = true
    40. activityIndicator.startAnimating()
    41. self.view.addSubview(activityIndicator)
    42. //Hide searchbar
    43. searchBar.resignFirstResponder()
    44. dismiss(animated: true, completion: nil)
    45. //Create search request
    46. let searchRequest = MKLocalSearch.Request()
    47. searchRequest.naturalLanguageQuery = searchBar.text
    48. let activeSearch = MKLocalSearch(request: searchRequest)
    49. activeSearch.start { (response, error) in
    50. activityIndicator.stopAnimating()
    51. UIApplication.shared.endIgnoringInteractionEvents()
    52. if response == nil{
    53. print("ERROR")
    54. }else
    55. {
    56. //Remove annotations
    57. let annotations = self.myMapView.annotations
    58. self.myMapView.removeAnnotations(annotations)
    59. //Getting data
    60. let latitude = response?.boundingRegion.center.latitude
    61. let longitude = response?.boundingRegion.center.longitude
    62. //Create annotation
    63. let annotation = MKPointAnnotation()
    64. annotation.title = searchBar.text
    65. annotation.coordinate = CLLocationCoordinate2DMake(latitude!, longitude!)
    66. self.myMapView.addAnnotation(annotation)
    67. //Zooming
    68. let coordinate:CLLocationCoordinate2D = CLLocationCoordinate2DMake(latitude!, longitude!)
    69. let span = MKCoordinateSpan(latitudeDelta: 0.0015, longitudeDelta: 0.0015)
    70. let region = MKCoordinateRegion(center: coordinate, span: span)
    71. self.myMapView.setRegion(region, animated: true)
    72. }
    73. }
    74. }
    75. //------------------------------------------Stichworte und RIC----------------------
    76. func numberOfComponents(in pickerView: UIPickerView) -> Int {
    77. return 2
    78. }
    79. func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
    80. if component == 0 {
    81. return stichw.count
    82. }
    83. else {
    84. let selectedalarmierung = pickerView.selectedRow(inComponent: 0)
    85. return stichw[selectedalarmierung].ric.count
    86. }
    87. }
    88. func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? {
    89. if component == 0 {
    90. return stichw[row].einsatzstichwort
    91. }
    92. else {
    93. let selectedalarmierung = pickerView.selectedRow(inComponent: 0)
    94. return stichw[selectedalarmierung].ric[row]
    95. }
    96. }
    97. func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) {
    98. pickerView.reloadComponent(1)
    99. let selectedalarmierung = pickerView.selectedRow(inComponent: 0)
    100. let selectedRic = pickerView.selectedRow(inComponent: 1)
    101. let einsatzstichwort = stichw[selectedalarmierung].einsatzstichwort
    102. let ri = stichw[selectedalarmierung].ric[selectedRic]
    103. print ("Stichwort: \(einsatzstichwort)")
    104. print ("Ric: \(ri)")
    105. GLala.ri = ri
    106. GLala.einsatzstichwort = einsatzstichwort
    107. }
    108. override func viewDidLoad() {
    109. // MARK: - View LifString(dString(describing: escrib)ing: ecycle
    110. //------------------------------------------Stichworte und RIC----------------------
    111. firstPickerView.delegate = self
    112. firstPickerView.dataSource = self
    113. stichw.append(alarmierung(einsatzstichwort: "BR01", ric: ["PAL1", "PAL2", "PAL3", "PAL4", "WABT", "FüC"]))
    114. //----------------------------------------------------------------------------------
    115. super.viewDidLoad()
    116. //zum Nummer Importieren
    117. einsatznummerTextField.keyboardType = UIKeyboardType.numberPad //Close Keyboard
    118. //zum Nummer Importieren
    119. // Hide Textfiel
    120. self.einsatznummerTextField.delegate = self
    121. // Zaehlt wie viele Einsaetze in der Liste stehen.
    122. print(CoreDataManager.shared.getNumberOfItems())
    123. // Do any additional setup after loading the view.
    124. oo(cellForRowAt: [0,0]) //Einsatznummer in Texfield
    125. }
    126. func oo(cellForRowAt indexPath: IndexPath) {
    127. var help: String
    128. var num: Int
    129. let einsatz = CoreDataManager.shared.getEinsatzItem(index: indexPath.row)
    130. //let einsatz = CoreDataManager.shared.getEinsatzItem(index: CoreDataManager.shared.getNumberOfItems() - 1 - indexPath.row)
    131. help = einsatz.einsatznummer ?? "error"
    132. num = Int(help) ?? 1
    133. num = num + 1
    134. help = String(num)
    135. einsatznummerTextField.text = help
    136. }
    137. //Springt hier rein wenn sich datePicker aendert
    138. @IBAction func datePickerChanged(_ sender: Any) {
    139. let dateFormatter = DateFormatter()
    140. dateFormatter.dateStyle = DateFormatter.Style.short
    141. dateFormatter.timeStyle = DateFormatter.Style.short
    142. let strDate = dateFormatter.string(from: datePicker.date)
    143. print (strDate)
    144. }
    145. // Return gedrueckt raus aus Textfeld
    146. override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?)
    147. {
    148. self.view.endEditing(true)
    149. }
    150. func textFieldShouldReturn(_ einsatznummerTextField: UITextField) -> Bool {
    151. einsatznummerTextField.resignFirstResponder()
    152. return (true)
    153. }
    154. // MARK: - Methods
    155. @IBAction func sichernButtonPressed(_ sender: UIBarButtonItem) {
    156. //Datum
    157. let dateFormatter = DateFormatter()
    158. dateFormatter.dateStyle = DateFormatter.Style.short
    159. dateFormatter.timeStyle = DateFormatter.Style.short
    160. let strDate = dateFormatter.string(from: datePicker.date)
    161. let date = String(strDate.prefix(8)) //Liesst die ersten 8 zeichen aus dem String
    162. let time = String(strDate.suffix(5)) //Liesst die letzten 8 zeichen aus dem String
    163. //Einsatznummer
    164. guard let nr = einsatznummerTextField.text else {
    165. print("Einsatznummer Eingeben!!") //Geht iwie nicht
    166. return }
    167. var ri = String()
    168. var einsatzstichwort = String()
    169. ri = GLala.ri
    170. einsatzstichwort = GLala.einsatzstichwort
    171. if ri == ""{
    172. ri = "PAL1"
    173. einsatzstichwort = "BR01"
    174. print("Er hat nicht gedreht, der Lomb!")
    175. }
    176. print ("Stichwort: \(einsatzstichwort)")
    177. print ("Ric: \(ri)")
    178. //Versuch
    179. //CoreDataManager.shared.createObj(datum: date)
    180. //Versuch
    181. //Erstellt Tabelle
    182. // CoreDataManager.shared.createObj(einsatznummer: nr + text + leer + leer + date + leer + time + " " + leer + einsatzstichwort, datum: date) // + leer + strDate
    183. CoreDataManager.shared.createObj(einsatznummer: nr, datum: date, uhrzeit: time, stichwort: einsatzstichwort, palst: ri) // + leer + strDate
    184. ri = ""
    185. GLala.ri = ""
    186. dismiss(animated: true, completion: nil)
    187. }
    188. @IBAction func abbruchButtonPressed(_ sender: UIBarButtonItem) {
    189. dismiss(animated: true) {
    190. print("Abbruch Button gedrueckt")
    191. }
    192. }
    193. }
    Alles anzeigen
  • Du solltest mal überdenken, warum Du in der Methode viewDidLoad explizit die Methode oo für die erste Zelle (die es ja gar nicht gibt) aufrufst:

    Quellcode

    1. oo(cellForRowAt: [0,0])
    Und ganz allgemein machen sprechende Variablenbezeichnungen und -konventionen das Lesen von fremden Code viel leichter (z. B. Variablennamen immer klein, Klassenbezeichnungen groß). Nur als Tipp...

    Mattes
    Diese Seite bleibt aus technischen Gründen unbedruckt.