Artigos com a tag 'self'

setAnimationDidStopSelector: diferentes usos e avançado

Na maioria dos casos, ou porque estamos acostumados ou porque vimos em tutoriais e em alguns textos, usamos o setAnimationDidStopSelector desta maneira:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
nil context : NULL ] ; [UIView beginAnimations: contexto nil: NULL];
1.5 ] ; [UIView setAnimationDuration: 1.5];
UIViewAnimationCurveEaseInOut ] ; [UIView setAnimationCurve: UIViewAnimationCurveEaseInOut];
self ] ; [SetAnimationDelegate UIView: 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. No código acima o setAnimationDelegate set self como delegado e através setAnimationDidStopSelector envia uma mensagem removeView quando a animação terminar. O próprio código está correto, no entanto, faz uso de uma definição de mensagem ( removeView ) que poderiam ser omitidos. Agora, aqui está o mesmo código, com o mesmo efeito, sem a mensagem de removeView :

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

; myView.alpha = 0;

; [UIView commitAnimations];

! A coisa interessante sobre essa abordagem é que myView poderia ser uma subclasse de UIView ! Portanto, pode ser uma classe personalizada com as nossas próprias mensagens e, como afirmou, facilmente acessível de setAnimationDidStopSelector . Além disso, o setAnimationDidStopSelector seletores de acordo com parâmetros:

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

; myView.alpha = 0;

; [UIView commitAnimations];

Este exemplo pode ser estendida para todos os casos aqui onde montamos um delegado, Atro não é um ponteiro para uma instância de qualquer objeto.

Continuação ...

Como criar o seu próprio protocolo com a delegada

Mesmo no tutorial mais simples que você pode encontrar o uso de protocolos. Ele com certeza vai acontecer a muitos em seu controlador vista a usar um protocolo, introduzindo, ao lado da definição da interface, uma declaração semelhante a:

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

Continuação ...

iPhone: criar uma forma de responder aos eventos que atravessam classe

Normalmente, um evento, que nada mais é do que uma mensagem é fixo (definido e implementado) na mesma classe ou contexto, a função ou procedimento "chamador". o in un UIViewController . Por exemplo, se adicionar um botão UIButton via código (de programação), podemos encontrar a nossa classe em um UIView ou um UIViewController . Em ambos os casos, a atribuição de tarefas e de inicialização do botão será seguido pela definição de target que devem receber uma mensagem quando ele "clica" no botão, digite:

1
2
3
4
5
6
7
8
9
[ UIButton buttonWithType : UIButtonTypeRoundedRect ] ; UIButton botão * = [UIButton buttonWithType: UIButtonTypeRoundedRect];
10 , 180 , 300 , 30 ) ; bottone.frame = CGRectMake (10, 180, 300, 30);
@ "Press me" forState : UIControlStateNormal ] ; [Button setTitle: @ "Press-me" Forst: UIControlStateNormal];
/ / Decida quem deve receber a mensagem UIControlEventTouchUpInside
self action : @selector ( onButtonClicked ) forControlEvents : UIControlEventTouchUpInside ] ; Botão [AddTarget: acção de auto: @ selector (onButtonClicked) forControlEvents: UIControlEventTouchUpInside];
/ / ...
void ) onButtonClicked { - (Void) {onButtonClicked
/ / ...
}

Linha 5, que decide o código mostrado acima (o objeto) e que (método) "Chamada" quando o nosso botão é pressionado. No exemplo acima, também é sabido que o ajuste da pressão da mensagem é enviada para o método onButtonClick implementada abaixo, então parte do mesmo contexto (ou classe). potremmo inviare il nostro messaggio ad un qualsiasi altro oggetto, posto quindi al difuori del contesto in uso. A primeira consideração é óbvio que podemos fazer, então, é que, alterando os parâmetros de self e action , podemos enviar nossa mensagem para qualquer outro objeto, em seguida, coloque na difuori contexto em uso. : Aqui está um exemplo: uma classe UIApplicationDelegate criar um UIViewController :

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

associata al UIViewController stesso: O SplashScreenController expõe um método que permite animar o UIView associados UIViewController mesmo:

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: contexto nil: nil];
0.75 ] ; [UIView setAnimationDuration: 0,75];
UIViewAnimationCurveEaseInOut ] ; [UIView setAnimationCurve: UIViewAnimationCurveEaseInOut];
self ] ; [SetAnimationDelegate UIView: 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 está consumado");
}

. O código acima mostra um método definido dentro da classe SplashScreenController tipo UIViewController . ) onAnimationFinished definito più sotto, facente parte sempre della classe SplashScreenController . Ele não faz nada, mas animar o UIView animando-o para baixo, e quando a animação for concluída, ligue para (enviar uma mensagem para si - daí self ) onAnimationFinished definido abaixo, é parte da classe sempre SplashScreenController . , non saremo informati della fine dell'animazione: Segue-se que no nosso myAppDelegate , quando invocamos o método animateBackgroundDown , não vamos ser informado do fim da animação:

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

O que pode querer, ao contrário, é criar uma nova versão do animateBackgroundDown que me diga para onde enviar a mensagem no final da animação, e qual o método a ser chamado. Na prática, quer certificar-se de escrever na nossa classe myAppDelegate :

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

, bensì in myAppDelegate . Desta vez, o método onAnimationFinished não está no UIViewController , mas em myAppDelegate . nel modo seguente: Para isso basta alterar o método de animateBackgroundDown em UIViewController como segue:

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

). Agora temos um método que leva o "contexto" ( target ) eo método a ser chamado ( selector ). a qualsiasi altro “oggetto” / classe in grado di riceverlo. Agora, quando a animação termina, a mensagem AnimationDidStop será enviada para myAppDelegate qualquer "objeto" outro / classe que pode recebê-la.

Continuação ...