Machen Sie UIAlertView-Blockierung

8

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.

%Vor%

Vielleicht, wie man diesen Code oder irgendwelche anderen Vorschläge repariert? Danke

    
kesrut 20.09.2010, 15:51
quelle

5 Antworten

8

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

    
Kostiantyn Sokolinskyi 21.09.2010, 09:18
quelle
5

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%     
Joseph Gagliardo 10.05.2013 13:17
quelle
2

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

haben

und 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.

    
Ender 15.12.2011 22:06
quelle
1

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.

    
Mirco Ellmann 03.05.2013 12:36
quelle
1

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.

    
Eduard Mossinkoff 18.09.2013 09:56
quelle

Tags und Links