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 ...
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 ...
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 ...
Últimos Comentários
Mark : @ Mark: Obrigado pela resposta. Por exemplo, se você tiver um código para salvar / usar a pasta ...
Mark : Obrigado pela resposta. Por exemplo, se você tiver um código para salvar / usar a pasta ...
Giovambattista Fazioli : @ Marcos: em princípio, absolutamente, muito depende de como eo que fazer o download. Louisiana ..
Mark : Olá guia, bom! Eu queria perguntar, você pode usar o mesmo código para executar um banco de dados sql? Em vez de ...
Joseph : Oi eu queria te perguntar como você pode fazer no post que eu enviei uma galeria de 50 imagens, por exemplo, ...