2017-04-13 6 views
0

Ich habe ein tableView in einem View Controller mit delegate und datasource durch den IB verdrahtet. Ich verwende die tableView für Multi-Auswahl. In meinem didSelectRowAt IndexPath, lässt Auswahl der Benutzer eine Beziehung zwischen zwei Core Data Einheiten markieren:Tableview didSelectRowAt indexPath nicht das erste Mal der Ansicht Lasten Brennen funktioniert super zum zweiten Mal

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) 
    { 

     let wageClassObject = self.wageClasses[indexPath.row] 
     let wageClassStatus = wageClassObject.value(forKey: "checked") as? Bool 
     wageClassObject.setValue(!wageClassStatus!, forKey:"checked") 

     if (wageClassStatus)! { 
     proposalToEdit?.addToWageClasses(wageClassObject)  
     } 
     else { 
      proposalToEdit?.removeFromWageClasses(wageClassObject)  
     }  
    } 

Wenn der Benutzer die Ansicht zum ersten Mal lädt, Auswählen einer Zeile hat keine Wirkung. Wenn der Benutzer die Ansicht ein zweites Mal lädt, funktionieren die Funktionen zum Hinzufügen und Entfernen sehr gut.

Ich habe jede vorgeschlagene Lösung in this thread aber keine Würfel versucht. Ich kann auch keinen Fall finden, der mir ähnlich ist, wo das Problem ist, dass es beim ersten Laden der Ansicht nicht funktioniert.

Vorschläge sehr geschätzt!

Edited hinzufügen: viewDidLoad und Core-Code Daten

override func viewDidLoad() { 
     loadProposalData() 
     tableView.reloadData() 
     super.viewDidLoad() 

     proposalNameField.delegate = self 
     pensionField.delegate = self 
     percentField.delegate = self 

     if let topItem = self.navigationController?.navigationBar.topItem { 

      topItem.backBarButtonItem = UIBarButtonItem(title: "", style: UIBarButtonItemStyle.plain, target: nil, action: nil) 

     } 
    if wageClasses != nil { 
      getWageClasses() 
      print("\(wageClasses)") 
     } 



    } 
func getWageClasses(){ 
     let fetchRequest: NSFetchRequest<WageClass> = WageClass.fetchRequest() 

     do { 
      try self.wageClasses = context.fetch(fetchRequest) 

     } catch { 
      // handle error 
     } 

    } 


@IBAction func calculateButtonTapped(_ sender: UIButton) { 

    var proposal: Proposal! 

    if proposalToEdit == nil { 
     proposal = Proposal(context: context) 

    } else { 

     proposal = proposalToEdit 

    } 



     proposal.dateCreated = currentDateTime as NSDate? 



    if let proposalName = proposalNameField.text { 
     proposal.proposalName = proposalName 
    } 

    if let pensionContribution = pensionField.text { 
     proposal.pensionContribution = (pensionContribution as NSString).doubleValue 
    } 

    if let percentIncrease = percentField.text { 
     proposal.percentIncrease = (percentIncrease as NSString).doubleValue 
    } 



    /// if let setting the checked value? 




    adD.saveContext() 

    _ = navigationController?.popViewController(animated: true) 
} 

Ich bin nicht viewDidAppear verwenden.

Ein wenig mehr über die Kerndaten. Ich habe zwei Entitäten, Vorschlag und Lohnklasse. Beide haben eine zu viele Beziehung zueinander. Auf diesem viewController kann der Benutzer den Vorschlag über drei Textfelder bearbeiten (Name, prozentuale Erhöhung, Rentenhöhe) und dann verwandte lohnKlassen aus der tableView auswählen.

Ich möchte, dass der Benutzer die Vorschlagsfelder eingeben und die zugehörigen lohnKlassen auswählen kann, wenn er zum ersten Mal in der Navigationsleiste des vorherigen viewControllers auf die Schaltfläche Hinzufügen klickt. Was passiert, ist, dass der Benutzer auf Hinzufügen klickt, die Daten in die Textfelder eingibt, die Lohnklassen auswählt und Treffer berechnet. Die Textfelder speichern und die Etiketten werden mit den programmierten Berechnungen aktualisiert, aber die lohnKlassen-Daten bleiben Null. Wenn der Benutzer den Vorschlag erneut auswählt (das ist, was ich meine, indem er die Ansicht ein zweites Mal oben lädt), kann der Benutzer die lohnklassen hinzufügen, und alle Berechnungen werden korrekt ausgeführt. Aber nicht vor dieser zweiten Öffnung der Ansicht.

screenshot of the view

+0

Kannst du zeigen, was genau du in 'viewDidLoad' und' viewDidAppear' Methoden machst und was meinst du mit "zweite Ansicht laden"? View Controller laden ihre Ansicht normalerweise einmal pro App-Lebenszyklus. Gibt es noch mehr Code zum Zugriff auf den Core Data Stack in diesem ViewController? –

+0

bearbeitet, um angeforderte Informationen hinzuzufügen. Vielen Dank! – camelCaseUpInYourFace

Antwort

0

Sie Code verwendet proposalToEdit Instanzvariable:

if (wageClassStatus)! { 
    proposalToEdit?.addToWageClasses(wageClassObject)  
} 
else { 
    proposalToEdit?.removeFromWageClasses(wageClassObject)  
} 

die im Grunde nil hier ist, muss es vor Aufrufen dieser Funktionen initialisiert werden, wodurch diese nicht ausgeführt Anrufe (nicht kann auf Nil-Objekt gemacht werden). Sie legen es auf den Kontext zum ersten Mal in calculateButtonTapped:

if proposalToEdit == nil { 
    proposal = Proposal(context: context) 
} 

, wenn Sie es wünschen ersten Mal arbeiten (dh vor dem ersten Klick auf ‚berechnen‘), fügen Sie über Code irgendwo in viewDidLoad, wie folgt aus:

override func viewDidLoad() { 
    loadProposalData() 
    if proposalToEdit == nil { 
     proposal = Proposal(context: context) 
    } 

Wenn oben nicht funktioniert, empfehle ich Ihnen einen Link zu dem Repository fügen Sie diesen Code zu helfen, zu debuggen, kann ich nicht mehr Fehler in hier finden, aber es gibt keine Angaben hinzufügen und entfernen von Implementierungen sowie wie Ihr Core Data Stack funktioniert.

0

Wenn jemand auf dem gleichen Problem feststeckt, ist der Schlüssel, den core data object zu erstellen, bevor Sie einen relationship zu einem anderen object hinzufügen.Der obige Code funktioniert nicht, weil ich versuchte, Beziehungen zu Objekten hinzuzufügen, die noch nicht existierten.

Meine Lösung war, die Operationen in zwei view controllers zu trennen, aber ich würde gerne mehr darüber wissen, wie dies in einem view controller erreicht werden kann.

Verwandte Themen