2016-03-30 19 views
1

Ich habe eine Option, ein Dokument grundsätzlich in meiner App zu drucken. Jetzt dürfen einige Dokumente nicht gedruckt werden (es sei denn, ein Kriterium ist angegeben). Also benutze ich Delegierte.Zurückgeben eines Bool-Werts von Funktion nach dem Anzeigen von AlertView

Beachten Sie, dass ich eine Mischung aus beiden Objective C und verwende.

Grundsätzlich meine Druckcode ist wie folgt:

if ([self.delegate respondsToSelector:@selector(shouldPrintDocument)]) { 
     BOOL shouldPrint = [self.delegate shouldPrintDocument]; 
     NSLog(@"Should Print %d", shouldPrint); 
     if (shouldPrint){ 
       //We will print here 
     } 
} 

Jetzt bei Swift Seite der Dinge, was ich im Wesentlichen tun müssen, ist mit dem Benutzer bestätigen, wenn sie mit dem Drucken des Dokuments fortfahren möchten. Also benutze ich eine UIAlertController.

Die Frage ist, wie gebe ich einen Bool-Wert aus dieser Warnmeldung.

func shouldPrintDocument() -> Bool { 
    let alertController = UIAlertController(title:"Confirm Print", 
     message: message, 
     preferredStyle: UIAlertControllerStyle.Alert) 

    let cancelAction: UIAlertAction = UIAlertAction(title: "Cancel", style: .Cancel, handler: {(action: UIAlertAction) -> Void in 
     alertController.dismissViewControllerAnimated(true, completion: { _ in }) 
     return false 
    }) 
    alertController.addAction(cancelAction) 
    let ok: UIAlertAction = UIAlertAction(title: "Confirm", style: .Default, handler: {(action: UIAlertAction) -> Void in 
     alertController.dismissViewControllerAnimated(true, completion: { _ in }) 
     //Perform some core data work here, i.e., save a few things and return 
     return true // This is where the issue comes in 
    }) 

    alertController.addAction(ok) 
    self.presentViewController(alertController, animated: true, completion: nil) 
} 
+0

Sie sollten an Sicherheit grenzender Wahrscheinlichkeit zu tun, dass in einem Verschluss. Ihre Funktion wird nicht darauf warten, dass eine andere Schließung zurückkehrt, ohne blockiert zu werden. Es sollte so bald wie möglich zurückkehren und einen Bool in seine Vollendung führen. – Dare

+0

@Dare Hallo, ja, aber ich bin mir nicht sicher, wie das geht? Könnten Sie mir in die richtige Richtung zeigen? –

+0

Sie können die Aktionsblatt-Delegatfunktion verwenden, von der Sie die Rückgabewerte abrufen können. –

Antwort

0

Sie geben kein Bool aus einer Warnmeldungsansicht zurück. Ihr "OK" UIAlertAction-Handler ist der Ort, an dem Sie die entsprechenden Maßnahmen ergreifen sollten. Überprüfen Sie dort, ob das Dokument gedruckt werden soll und drucken Sie es dann aus. Oder rufen Sie eine Methode von dort, die dies tun wird. Aber tun Sie es aus dem Handler heraus. Der Handler ist der Code-Block, wo Sie sich gerade den Kommentar haben „// Perform einige Daten Arbeit stellen ...“

+0

Die Optionen zum Drucken von Dokumenten befinden sich in einer separaten PDF-Viewer-Klasse. Daher versuche ich, meinen Core Data-Code nicht zu verschieben. Wenn der Druckknopf angetippt wird, fragt diese PDF-Klasse ihren Delegierten, ob es in Ordnung ist, weiterzumachen und zu stopfen. Deshalb verwende ich diesen Ansatz. –

+0

Das hat nichts mit Core Data zu tun. Sie bitten den Benutzer zu bestätigen, ob das Dokument gedruckt werden soll. Der Alarm wird auf dem Bildschirm angezeigt, wer weiß, wie lange er wartet, bis der Benutzer antwortet. Wenn der Benutzer auf "Bestätigen" klickt, wird Ihr Handler aufgerufen. Das ist der richtige Ort, um zu prüfen, ob das Dokument gedruckt werden kann und um den Druckvorgang zu starten. Sie müssen nichts verschieben, rufen Sie einfach Ihre PDF Viewer-Klasse über den Handler auf. Sie können Objective-C von Swift aus aufrufen. –

0

Try this:

var isprint:BOOL = false 

func shouldPrintDocument() -> Bool { 
let alertController = UIAlertController(title:"Confirm Print", 
    message: message, 
    preferredStyle: UIAlertControllerStyle.Alert) 

let cancelAction: UIAlertAction = UIAlertAction(title: "Cancel", style: .Cancel, handler: {(action: UIAlertAction) -> Void in 
    alertController.dismissViewControllerAnimated(true, completion: { _ in }) 
    isprint = false 
}) 
alertController.addAction(cancelAction) 
let ok: UIAlertAction = UIAlertAction(title: "Confirm", style: .Default, handler: {(action: UIAlertAction) -> Void in 
    alertController.dismissViewControllerAnimated(true, completion: { _ in }) 
    //Perform some core data work here, i.e., save a few things and return 
    isprint = true// This is where the issue comes in 
}) 

alertController.addAction(ok) 
self.presentViewController(alertController, animated: true, completion: nil) 
}