Artikel Tagged 'Selbst'

setAnimationDidStopSelector: unterschiedliche Nutzungen und Fortgeschrittene

In den meisten Fällen, oder weil wir gewohnt sind oder weil wir in Tutorien und in manchen Texten gesehen haben, verwenden wir die setAnimationDidStopSelector auf diese Weise:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
nil context : NULL ] ; [UIView beginAnimations: nil context: NULL];
1.5 ] ; [UIView setAnimationDuration: 1,5];
UIViewAnimationCurveEaseInOut ] ; [UIView setAnimationCurve: UIViewAnimationCurveEaseInOut];
self ] ; [UIView setAnimationDelegate: self];
@selector ( removeView ) ] ; [UIView setAnimationDidStopSelector: @ selector (removeView)];

; myView.alpha = 0;

; [UIView commitAnimations];

/ /

void ) removeView { - (Void) {removeView
; [MyView removeFromSuperview];
}

come delegato e tramite la setAnimationDidStopSelector gli invia un messaggio removeView quando l'animazione è terminata. In dem obigen Code der setAnimationDelegate gesetzt self als Delegierter und durch setAnimationDidStopSelector sendet eine Nachricht removeView , wenn die Animation beendet ist. Der Code selbst korrekt ist, jedoch zur Verwendung einer Nachricht Wortes ( removeView ) aufweist, weggelassen werden könnte. Nun, hier ist der gleiche Code, mit dem gleichen Effekt, ohne die Nachricht removeView :

1
2
3
4
5
6
7
8
9
nil context : NULL ] ; [UIView beginAnimations: nil context: NULL];
1.5 ] ; [UIView setAnimationDuration: 1,5];
UIViewAnimationCurveEaseInOut ] ; [UIView setAnimationCurve: UIViewAnimationCurveEaseInOut];
myView ] ; [UIView setAnimationDelegate: myView];
@selector ( removeFromSuperview ) ] ; [UIView setAnimationDidStopSelector: @ selector (removeFromSuperview)];

; myView.alpha = 0;

; [UIView commitAnimations];

! Das Interessante an diesem Ansatz ist, dass myView könnte sein, eine Unterklasse von UIView ! Es kann daher eine benutzerdefinierte Klasse mit eigenen Botschaften zu sein und in der Weise dargelegt, durch leise genannt setAnimationDidStopSelector . Darüber hinaus sind die setAnimationDidStopSelector zustimmen Selektoren mit Parametern:

1
2
3
4
5
6
7
8
9
nil context : NULL ] ; [UIView beginAnimations: nil context: NULL];
1.5 ] ; [UIView setAnimationDuration: 1,5];
UIViewAnimationCurveEaseInOut ] ; [UIView setAnimationCurve: UIViewAnimationCurveEaseInOut];
myView ] ; [UIView setAnimationDelegate: myView];
@selector ( myMessage : param1 : ) ] ; [UIView setAnimationDidStopSelector: @ selector (myMessage: param1 :)];

; myView.alpha = 0;

; [UIView commitAnimations];

Dieses Beispiel auf alle Fälle hier, wo wir einen Delegierten erweitert werden kann, ist nicht atro ein Zeiger auf eine Instanz eines Objekts.

Mehr ...

Wie Sie Ihr eigenes Protokoll erstellen mit delegierter

Selbst in den einfachsten Tutorial finden Sie die Verwendung von Protokollen. Es wird sicherlich auf viele Ihrer View-Controller in einem Protokoll, das geschehen, verteilen, neben der Definition der Schnittstelle, eine Anweisung ähnlich:

1
2
3
UIViewController <uiwebviewdelegate> { @ Interface myViewController: UIViewController {<uiwebviewdelegate>
...
}

Mehr ...

iPhone: Erstellen Sie einen Weg, um auf Ereignisse, die Klasse zu überqueren reagieren

Normalerweise wird ein Ereignis, das nichts anderes als eine Nachricht festgelegt ist (gesetzt und umgesetzt) ​​in der gleichen Klasse oder Rahmen, die Funktion oder Prozedur "Anrufer" ist. o in un UIViewController . Wenn wir zum Beispiel eine Schaltfläche hinzufügen UIButton via Code (programmatisch), können wir unsere Klasse in einem zu finden UIView oder einem UIViewController . In beiden Fällen ist die Aufgabenverteilung und die Initialisierung der Taste wird durch die Einstellung des befolgt werden target , die eine Nachricht erhalten soll, wenn es "Klick" auf die Schaltfläche ein:

1
2
3
4
5
6
7
8
9
[ UIButton buttonWithType : UIButtonTypeRoundedRect ] ; UIButton Taste * = [UIButton buttonWithType: UIButtonTypeRoundedRect];
10 , 180 , 300 , 30 ) ; bottone.frame = CGRectMake (10, 180, 300, 30);
@ "Press me" forState : UIControlStateNormal ] ; [Button setTitle: @ "Drück mich" forState: UIControlStateNormal];
/ / Entscheiden Sie, wer die Nachricht erhalten UIControlEventTouchUpInside
self action : @selector ( onButtonClicked ) forControlEvents : UIControlEventTouchUpInside ] ; [AddTarget Button: Selbst Aktion: @ selector (OnButtonClicked) forControlEvents: UIControlEventTouchUpInside];
/ / ...
void ) onButtonClicked { - (Void) {OnButtonClicked
/ / ...
}

Zeile 5 der oben angezeigten Code entscheidet, wer (Subjekt) und was (Verfahren) "Anruf", wenn unsere Taste gedrückt wird. In dem dargestellten Beispiel oben ist auch bemerkenswert, dass die Einstellung der Nachricht von Druck auf dem Verfahren gesendet wird onButtonClick implementiert mehr Unten, und die Teil des gleichen Zusammenhang (oder Klasse). potremmo inviare il nostro messaggio ad un qualsiasi altro oggetto, posto quindi al difuori del contesto in uso. Die erste Überlegung ist offensichtlich, dass wir tun können, ist dann, dass durch Veränderung der Parameter self und action können wir unsere Botschaft an jedes andere Objekt zu senden, dann auch außerhalb des Kontextes, in Gebrauch. : Hier ein Beispiel: Eine Klasse UIApplicationDelegate eine UIViewController :

1
2
3
4
5
/ /
/ / MyAppDelegate.m
/ /
SplashScreenController alloc ] ; splashScreenController = [SplashScreenController alloc];
splashScreenController.view ] ; [Window addSubview: splashScreenController.view];

associata al UIViewController stesso: Die SplashScreenController macht eine Methode, mit der Sie die Animation erlaubt UIView mit verbundenen UIViewController gleiche:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/ /
/ / SplashScreenController.m
/ /
void ) animateBackgroundDown { - (Void) {animateBackgroundDown
nil context : nil ] ; [UIView beginAnimations: nil context: nil];
0.75 ] ; [UIView setAnimationDuration: 0,75];
UIViewAnimationCurveEaseInOut ] ; [UIView setAnimationCurve: UIViewAnimationCurveEaseInOut];
self ] ; [UIView setAnimationDelegate: self];
@selector ( onAnimationFinished ) ] ; [UIView setAnimationDidStopSelector: @ selector (onAnimationFinished)];
CGRect ) { 0 , 480 , 320 , 480 } ; self.view.frame = (CGRect) {0, 480, 320, 480};
; [UIView commitAnimations];
}
/ / ...
void ) onAnimationFinished { - (Void) {onAnimationFinished
"Animazione terminata" ) ; NSLog (@ "Animation beendet");
}

. Der obige Code zeigt eine Methode innerhalb der Klasse definiert SplashScreenController Typ UIViewController . ) onAnimationFinished definito più sotto, facente parte sempre della classe SplashScreenController . Es tut nichts, aber animieren die UIView animieren ihn hin, und wenn die Animation abgeschlossen ist, rufen Sie (senden eine Nachricht an sich selbst - und damit self ) onAnimationFinished unten definiert, ist ein Teil der Klasse immer SplashScreenController . , non saremo informati della fine dell'animazione: Daraus folgt, dass in unserem myAppDelegate , wenn wir die Methode aufrufen animateBackgroundDown , werden wir nicht von dem Ende der Animation zu informieren:

1
2
3
4
/ /
/ / MyAppDelegate.m
/ /
; [SplashScreenController animateBackgroundDown];

Was wir wollen, stattdessen ist es, eine neue Version erstellen animateBackgroundDown als ihm zu sagen, wo um die Nachricht zu Ende Animation senden und welche Methode zu nennen. In der Praxis wollen wir sicherstellen, können Sie in unserer Klasse schreiben myAppDelegate :

1
2
3
4
5
6
7
8
/ /
/ / MyAppDelegate.m
/ /
self selector : @selector ( onAnimationFinished ) ] ; [SplashScreenController animateBackgroundDown: self selector: @ selector (onAnimationFinished)];
/ / ...
void ) onAnimationFinished { - (Void) {onAnimationFinished
"Animazione terminata" ) ; NSLog (@ "Animation beendet");
}

, bensì in myAppDelegate . Dieses Mal das Verfahren onAnimationFinished nicht im UIViewController , aber in myAppDelegate . nel modo seguente: Dazu ändern Sie einfach die Methode animateBackgroundDown in UIViewController wie folgt:

1
2
3
4
5
6
7
8
9
10
11
12
/ /
/ / SplashScreenController.m
/ /
void ) animateBackgroundDown : ( id ) target selector : ( SEL ) selector { - (Void) animateBackgroundDown: (id) Zielauswahlvorrichtung: (SEL) {Selektor
nil context : nil ] ; [UIView beginAnimations: nil context: nil];
0.75 ] ; [UIView setAnimationDuration: 0,75];
UIViewAnimationCurveEaseInOut ] ; [UIView setAnimationCurve: UIViewAnimationCurveEaseInOut];
target ] ; [UIView setAnimationDelegate: target];
selector ] ; [UIView setAnimationDidStopSelector: Selektor];
CGRect ) { 0 , 480 , 320 , 480 } ; self.view.frame = (CGRect) {0, 480, 320, 480};
; [UIView commitAnimations];
}

). Jetzt haben wir eine Methode, die den "Kontext" (akzeptiert target ) und die Methode aufgerufen werden ( selector ). a qualsiasi altro “oggetto” / classe in grado di riceverlo. Nun, wenn die Animation beendet, erscheint die Meldung AnimationDidStop geht an myAppDelegate andere "Objekt" / Klasse, die sie empfangen können.

Mehr ...


Stop SOPA