Artigos com a tag 'UIViewController'

Objective-C: Adenda sobre as notificações e delegados

Responda à pergunta de ILeW com um artigo para explicar melhor em si, juntando exemplo de trabalho, como delegados e notificações. Usando um padrão que vemos primeiro como padrão o delegado:

Delegate

Um objeto em busca de um delegado

Leia mais ...

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

Normalmente, um evento, que nada mais é 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 deverá 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 ] ; [Botão setTitle: @ "Prima-me" forState: 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 do código mostrado acima decide quem (sujeito) e aquilo (método) "Chamada" quando o nosso botão é pressionado. No exemplo ilustrado acima é também conhecido que a pressão definindo da mensagem é enviada para o método onButtonClick implementado abaixo, e, em seguida, fazendo 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 self e action podemos enviar nossa mensagem para qualquer outro objeto, em seguida, coloque também fora do 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 associado 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: auto];
@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 (@ "Animação terminada");
}

. 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 animá-lo para baixo, e quando a animação é completa, 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 nós queremos, em vez disso, é criar uma nova versão do animateBackgroundDown como a dizer-lhe para onde enviar a animação final da mensagem e qual método chamar. Na prática, queremos ter certeza que você pode escrever em 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 (@ "Animação terminada");
}

, bensì in myAppDelegate . Desta vez, o método onAnimationFinished não está no UIViewController , mas em myAppDelegate . nel modo seguente: Para fazer isto simplesmente alterar o método animateBackgroundDown em UIViewController como se 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 seletor: (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 aceita 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á enviado para myAppDelegate qualquer "objeto" outro / classe que pode recebê-lo.

Leia mais ...

iPhone SecondApp: Adivinhe o número - Parte 2

Como mencionado iPhone FirstApp: Adivinhe o número - Parte 1 vemos como fazer um aplicativo para o iPhone da Apple sem usar o Interface Builder! Na verdade, vamos eliminar arquivos físicos criados pela Interface Builder assistente Xcode. No final deste post, então, temos um pedido idêntico em todos os aspectos, àquelas construídas na primeira parte, com a diferença que nós vamos alcançar todos os nossos componentes visuais, incluindo a janela principal, para o código completo.

O aplicativo já feito, se você quiser apenas fazer o download, está disponível no meu repositório do Google Code:

Eu gostaria de apontar imediatamente como o ZIP deste exemplo pesa menos que a última vez! :)

Criamos o projeto

Começamos criando o nosso projeto SecondApp (para distingui-lo de FirstApp), embora desta vez escolha Janela aplicativo baseado em:

newproject

Agora vamos apagar tudo relacionado com o Interface Builder. : eliminatelo anche dal file system, quindi selezionate Also Move to Trash . Elimine o arquivo MainWindow.xib , localizado na pasta de Resources , remova-o do sistema de arquivos também, e em seguida, selecione também mover para a lixeira. nella casella Main nib file base name : Selecione então o arquivo SecondoApp-info.plist e excluir a referência ao MainWindow arquivo nib no nome da caixa principal com base em:

deleteib

Neste ponto não temos mais qualquer janela, pelo menos até o Interface Builder. , e modifichiamo la funzione main() in questo modo: Então vamos abrir o arquivo main.m , situado em Other Sources , e modificar a função main() , exemplo:

1
2
3
4
5
6
7
8
9
10
11
int argc, char * argv [ ] ) { int main (int argc, char * argv []) {

pool = [ [ NSAutoreleasePool alloc ] init ] ; NSAutoreleasePool piscina * = [[ NSAutoreleasePool alloc] init];

/ / Ao remover o arquivo. XIB perdemos rastreamento
/ / O delegado app e então passá-lo para "mão"
UIApplicationMain ( argc, argv, nil , @ "SecondAppAppDelegate" ) ; int retVal = UIApplicationMain (argc, argv, nil, @ "SecondAppAppDelegate");

; [Lançamento Piscina];
voltar retVal;
}

Abra SecondAppAppDelegate.me então criar a janela principal via código:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void ) applicationDidFinishLaunching : ( UIApplication * ) application { - ApplicationDidFinishLaunching (Void): (UIApplication *) {aplicação

/ / Pega o tamanho da tela (320, 480)
UIScreen mainScreen ] applicationFrame ] ; CGRect windowRect = [[mainScreen UIScreen] applicationFrame];
/ / Cria uma janela - como fizemos adeus ao Interface Builder
[ [ UIWindow alloc ] initWithFrame : windowRect ] ; UIWindow MainWindow * = [[UIWindow alloc] initWithFrame: windowRect];
/ / Definir o fundo da Janela para o amarelo, para diferenciar
/ / O pedido anterior FirstApp
[ UIColor yellowColor ] ] ; [MainWindow SetBackgroundColor: [UIColor yellowColor]];

mainWindow ] ; [Self setWindow: MainWindow];
; [Janela makeKeyAndVisible];

; [MainWindow release];
}

Você já pode testar o aplicativo, se aparece uma janela amarela que você fez tudo certo!

, necessario solo se si usa Interface Builder. No arquivo SecondAppAppDelegate.h podemos eliminar IBOutlet , só é necessário se você usa o Interface Builder. Também acrescentar aqui que nossas variáveis ​​globais, a última vez que tinha entrado no controlador. Em seguida, modifique o arquivo SecondAppAppDelegate.h :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# Importar <UIKit/UIKit.h>

NSObject <UIApplicationDelegate> { @ SecondAppAppDelegate Interface: NSObject {<UIApplicationDelegate>
UIWindow janela *;

UITextField * número;
UIButton * botão;
int numeroACaso;
}

nonatomic, retain ) UIWindow * window; @ Property (nonatomic, reter) UIWindow janela *;

void ) controllaNumero; - (Void) getNumber;

@ End

, in quanto non stiamo usando Interface Builder. Também neste caso, nós preparamos a definição do método controllaNumero , como da última vez, mas nós eliminamos a indicação IBAction , uma vez que não estamos usando o Interface Builder.

Nós construímos o código da interface

É hora de criar o código usando todos os componentes de nossa interface. ed inseriamo il seguente codice: Voltamos no arquivo SecondAppAppDelegate.m , posizioniamoci antes [mainWindow release] e insira o seguinte código:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
/ / Cria a barra de título
[ [ UINavigationBar alloc ] initWithFrame : CGRectMake ( 0.0 , 0.0 , 320.0 , 44.0 ) ] ; UINavigationBar myNavigationBar * = [[UINavigationBar alloc] initWithFrame: CGRectMake (0,0, 0,0, 320,0, 44,0)];
myNavigationBar.barStyle = UIBarStyleDefault;
[ [ UINavigationItem alloc ] initWithTitle : @ "Indovina un numero" ] ; UINavigationItem navigationItem * = [[UINavigationItem alloc] initWithTitle: @ "Acho que um número"];
navigationItem animated : NO ] ; [MyNavigationBar pushNavigationItem: navigationItem animado: NO];
myNavigationBar ] ; [Janela addSubview: myNavigationBar];

/ / Criar o rótulo
[ [ UILabel alloc ] initWithFrame : CGRectMake ( 10 , 50 , 300 , 80 ) ] ; UILabel myLabel * = [[UILabel alloc] initWithFrame: CGRectMake (10, 50, 300, 80)];
UIColor clearColor ] ; myLabel.backgroundColor = [UIColor clearColor];
; myLabel.numberOfLines = 2;
"iPhone ha pensato un numero da 1 a 10, prova ad indovinarlo?" ; myLabel.text = @ "iPhone criou um número de 1 a 10, tentar adivinhar?"
myLabel ] ; [Janela addSubview: myLabel];

/ / Criar a entrada de texto
UITextField alloc ] initWithFrame : CGRectMake ( 10 , 120 , 300 , 30 ) ] ; = número [[UITextField alloc] initWithFrame: CGRectMake (10, 120, 300, 30)];
numero.borderStyle = UITextBorderStyleRoundedRect;
numero.textAlignment = UITextAlignmentCenter;
numero.keyboardType = UIKeyboardTypeNumberPad;
"Inserisci il numero" ; numero.placeholder = @ "Digite o número";
numero ] ; [Janela addSubview: número];

/ / Cria o botão
UIButton buttonWithType : UIButtonTypeRoundedRect ] ; botão = [UIButton buttonWithType: UIButtonTypeRoundedRect];
10 , 180 , 300 , 30 ) ; bottone.frame = CGRectMake (10, 180, 300, 30);
@ "Premi qui" forState : UIControlStateNormal ] ; [Botão setTitle: @ "Clique aqui" forState: UIControlStateNormal];
self action : @selector ( controllaNumero ) forControlEvents : UIControlEventTouchUpInside ] ; Botão [AddTarget: acção de auto: @ selector (getNumber) forControlEvents: UIControlEventTouchUpInside];
bottone ] ; [Janela addSubview: botão];

; [MyLabel release];
; [NavigationItem release];
; [MyNavigationBar release];

della scorsa volta, subito dopo il [mainWindow release]; inseriamo: Desde o ' applicationDidFinishLaunching corresponde a viewDidLoad como da última vez, logo após a [mainWindow release]; inserção:

1
+ arc4random ( ) % 10 ; numeroACaso = 1 + arc4random () 10%;

Agora, podemos fazer é implementar o método controllaNumero , que será idêntico (para além do protótipo) à utilizada a última vez:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
void ) controllaNumero { - (Void) {getNumber
"Premuto bottone di controlla numero" ) ; NSLog (@ "número de controle pressionado o botão");
[ numero.text integerValue ] ; numeroInserito int = [numero.text integerValue];
message; NSString * mensagem;
"Il numero inserito è %d" , numeroInserito ) ; NSLog (@ "O número digitado é% d", numeroInserito);
numeroInserito <numeroACaso ) { if (numeroInserito <numeroACaso) {
"Troppo basso..." ; mensagem = @ "muito baixo ...";
( numeroInserito> numeroACaso ) { } Else if (numeroInserito> numeroACaso) {
"Troppo alto..." ; mensagem = @ "muito alto ...";
( numeroInserito == numeroACaso ) { } Else if (numeroInserito numeroACaso ==) {
"Bravo hai indovinato" ; mensagem = @ "Bravo você adivinhou-lo";
+ arc4random ( ) % 10 ; numeroACaso = 1 + arc4random () 10%;
"Numero pensato %d" , numeroACaso ) ; NSLog (@ "% d Número pensei," numeroACaso);
}
[ [ UIAlertView alloc ] UIAlertView alertMessaggio * = [[UIAlertView alloc]
"Responso" initWithTitle: @ "Resposta"
mensagem: mensagem
delegado: nil
"OK" cancelButtonTitle: @ "OK"
] ; otherButtonTitles: nil];
; [AlertMessaggio show];
; [AlertMessaggio release];
"" ; numero.text @ = "";
}

Nós somos feitos!

Conclusões e considerações

, proprio perchè volevo lasciarlo il più semplice e snello possibile e, anche, per dimostrare che non sono elementi sempre necessari. Este exemplo não fazer uso direto de um UIView ou UIViewController , porque eu queria deixá-lo tão simples e aligeirados quanto possível e, também, para mostrar que os elementos não são sempre necessários. No entanto, a inserção de objetos diretamente na janela pode ter algum sentido neste exemplo e em outros contextos esporádicos. portano comunque benefici in tantissimi altri casi, ein alcuni sono praticamente indispensabili; come avremo modo di vedere in futuro. O uso de UIView e UIViewController ainda trazer benefícios em muitos outros casos, ena alguns são quase indispensáveis, como veremos no futuro.

Leia mais ...


Pare SOPA