Ich muss UIAlertView
blockieren machen. Weil ich Funktion habe und ich muss UIAlertView
Wahl zurückgeben. Aber Problem ist, dass, nachdem UIAlertView
gezeigt wird, mein Funktionscode weiter ausführt, also kann ich UIAlertView
Wahl nicht fangen (ich kann es in den Delegiertenmethoden tun, aber ich muss Funktionsergebnis zurückgeben).
Ich habe versucht, UIAlertVIew
blocking mit NSCondition
zu machen. Aber der Code funktioniert nicht.
Vielleicht, wie man diesen Code oder irgendwelche anderen Vorschläge repariert? Danke
Es gibt keine Möglichkeit zu erreichen, was Sie wollen. Nur durch den Delegierten. Sie sollten Ihre Funktion neu entwerfen oder die Verwendung von UIAlertView verweigern
Das macht es nicht blockierend, aber ich habe eine Unterklasse geschrieben, um die Blockstilsyntax hinzuzufügen, was es viel einfacher macht, die buttonClickedAtIndex-Methode zu handhaben, ohne einen Delegaten und eine ganze Menge if-Anweisungen zu machen, wenn Sie mehrere UIAlertViews haben in einer Klasse.
%Vor%Um es hier anzurufen, gibt es einen Beispielcode. Der andere coole Teil ist, dass, weil sich ein Block um die lokalen Variablen schließt, ich Zugriff auf alle Zustände haben kann, die zu der Zeit existierten, als ich die UIAlertView zeigte. Bei Verwendung des herkömmlichen Delegatenansatzes müssten Sie diesen gesamten temporären Status in Variablen auf Klassenebene speichern, um im Aufruf von buttonClickedAtIndex im Delegaten darauf zugreifen zu können. Das ist so viel sauberer.
%Vor%Ich hatte gerade das gleiche Problem. Obwohl es keine Lösung gibt, gibt es mindestens zwei Problemumgehungen, an die ich gedacht habe.
Schleife "Lösung" Direkt nachdem Sie den UIAlert aufgerufen haben, starten Sie eine Schleife, die nach der Änderung einer Variablen sucht, die für Ihr Objekt global ist (nicht für das ganze Projekt). Diese Variable ist diejenige, die Sie im UIAlert-Delegaten für die Antworten festgelegt haben. Also im Grunde warten Sie auf "ist A == 1, wenn nicht DoEvents" und Schleife auf es.
Dann auf dem Delegaten machen Sie A = 1, wenn Sie die Antwort
habenund bevor jemand sagt, dass es in Cocoa keine DoEvents gibt:
%Vor%Delegierte Lösung Anstatt den Code zu verwenden, der sich mit der Antwort A, B oder C in der Funktion beschäftigt, die die Warnung aufruft, muss der Code im Delegaten selbst enthalten sein.
Ich hoffe, es hilft. Ich habe den zweiten in meinem Projekt verwendet und es hat funktioniert.
Ich habe diese Frage gerade zufällig gefunden, und selbst wenn ich Apple in die Hölle stecke, indem ich das hier poste, erkläre ich dies hiermit als Beweis des Konzepts:
%Vor%Hier ist die statische Methode für eine Ja / Nein-Abfrage:
%Vor%und schließlich die Delegate-Methode für die Handhabung der Schaltfläche klicken und Stoppen Sie die Runloop-Verarbeitung:
%Vor%Das funktioniert, aber denken Sie daran: Sie sollten es nicht so machen :-D Bitte streite nicht über Stil und Zeug, es ist nur ein 5 Minuten schneller Hack, um zu beweisen, dass es möglich ist! Dies sollte ohne ARC funktionieren (neu - & gt; Autorelease) aber wenn ich falsch liege, weißt du, wie man damit umgeht;)
Haftungsausschluss: Ich bin nicht verantwortlich für mögliche Schäden, die die Verwendung dieses Snippets Ihrer Anwendung oder Ihren Geräten verursachen könnte. Danke.
Verwenden Sie die UIAlertView mit Blöcken von Joseph und fügen Sie einen Semaphor hinzu. Deklariere ein globales Semaphor
%Vor%Und signalisieren Sie den Semaphor im Blockhandler
%Vor%Fügen Sie nach dem Aufruf von showWithHandler eine Warteschleife mit dem Semaphor hinzu
%Vor%Ihr tatsächlicher Timeout-Wert kann je nach Ihren Anforderungen unterschiedlich sein.
Tags und Links ios cocoa-touch