2016-06-26 4 views
0

Ich habe eine Datei in Swift, die alle meine Abfragen enthält. Und beim Speichern eines Datensatzes mit saveOperation.perRecordProgressBlock diese Datei Aufruf ChatView View-Controller und aktualisiert die Funktion progressBarUpdate.Fortschrittsbalken stürzt ab, wenn von Swift-Datei aktualisiert wird, ist es nicht ViewController

Bis jetzt kann ich den Druck innerhalb progressBarUpdate erhalten, um den Fortschritt gut zu drucken. Aber wenn ich progressBarMessage.setProgress(value!, animated: true) die Anwendung aktualisieren nur mit dem folgenden Fehler abstürzen: fatal error: unexpectedly found nil while unwrapping an Optional value

Wenn ich versuche, progressBarMessage.setProgress(value!, animated: true zu laufen) durch viewDidLoad aktualisiert sie die Fortschrittsbalken in Ordnung, kein Fehler. Was bedeutet, dass die Steckdose gut funktioniert.

Andere Sache zu prüfen, ist, dass meine print(".... perRecordProgressBlock - CHAT VIEW\(value)") funktioniert gut. Wenn die Updates von Queris.swift abgerufen werden. Es ist nur das progressBarUpdate, das Probleme verursacht.

@ my Queries.swift Datei Option 1

saveOperation.perRecordProgressBlock = { (recordID, progress) -> Void in 
    print("... perRecordProgressBlock \(Float(progress))") 
    var chatView = ChatView() 
    chatView.progressBarUpdate(Float(progress)) 
} 

@ my Queries.swift Datei Option 2

saveOperation.perRecordProgressBlock = { (recordID, progress) -> Void in 
    print("... perRecordProgressBlock \(Float(progress))") 

    let storyboard = UIStoryboard(name: "Main", bundle: nil) 
    let chatViewController = storyboard.instantiateViewControllerWithIdentifier("ChatViewVC") as! ChatView 
    chatViewController.progressBarUpdate(Float(progress)) 
} 

@ ChatView View-Controller

func progressBarUpdate(value: Float) 
{ 
    print(".... perRecordProgressBlock - CHAT VIEW\(value)") 
    if (value as? Float) != nil 
    { 
     progressBarMessage.setProgress(value, animated: true) 
    } 
} 
+0

Sind Sie sicher, dass "value" ein non-nil ist? 'progressBarMessage.setProgress (Wert, animiert: true) ' – Santosh

+0

ziemlich sicher, schauen Sie sich den aktualisierten Code an. wo ich sicherstelle, dass keine 'nil' zu 'progressBarMessage' übergeht – GuiSoySauce

Antwort

0
var chatView = ChatView() 

Ich gehe hier auf ein Bein und sage, dass Sie Storyboards/Xibs verwenden. Wenn dies der Fall ist, wäre das obige Vorgehen nicht die korrekte Art, einen neuen View-Controller zu instanziieren. Here's some information on the difference (die Frage bezieht sich auf Objective-C, aber das Konzept ist das gleiche in Swift)

let storyboard = UIStoryboard(name: "Main", bundle: nil) 
let chatViewController = storyboard.instantiateViewControllerWithIdentifier("identifier-you-set-in-storyboard") as! ChatView 

Wo identifier-you-set-in-storyboard ist set in the interface builder (die verknüpfte Frage ist alt, aber stellt das Konzept, kann das Feld Label in neueren Versionen geändert hat)


Wenn von einigen vagen Hoffnung, Sie Sie erstellen setzen Ihre Ansichten in Code auf (im Gegensatz zu Storyboards gegen), dann würden Sie chatView.loadView() vor chatView.progressBarUpdate... anrufen müssen. (Oder versuchen Sie einfach die view Eigenschaft zuzugreifen und es sollte loadView für Sie anrufen.)

+0

Ich habe ein Update zu meiner Frage mit Ihren Vorschlägen gemacht. Funktioniert immer noch nicht. Beachten Sie, dass die print-Anweisung in 'func progressBarUpdate' einwandfrei funktioniert. Nur der Fortschrittsbalken, der fehlschlägt. – GuiSoySauce

+0

@GuiSoySauce Versuchen Sie vor dem Aufruf von progressBarUpdate 'let _ = chatViewController.view' hinzuzufügen. Dadurch wird der View-Controller gezwungen, die Ansicht tatsächlich zu laden und die Eigenschaft der Fortschrittsanzeige richtig einzustellen. –

0

Die Art und Weise Sie die viewController sind Instanziierung ist nicht der richtige Weg und damit der Absturz/nil val. viewController lädt seine Ansichtshierarchie nur, wenn etwas eine view Nachricht sendet. Das System führt dies selbst aus, wenn die Hierarchie view auf dem Bildschirm angezeigt werden soll. Und es passiert nach Anrufen wie prepareForSegue:sender: und viewWillAppear:, loadView(), self.view.

Also hier sind Ihre Steckdosen immer noch Null, da es noch nicht geladen ist.

Versuchen Sie einfach, viewControllerself.view aufrufen und dann auf die Funktionen von diesem viewController zuzugreifen.