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:

Um objeto em busca de um delegado
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:

Um objeto em busca de um delegado
non funzionano quando un UIButton è impostato in modalità UIButtonTypeCustom ! Os estados UIControlStateSelected ou UIControlStateHighlighted não funcionam quando um UIButton modo é definido UIButtonTypeCustom ! Ou melhor, não funciona (porque reservado para outros tipos de botão), por exemplo, para criar um botão com dois estados: nota de alternância. Se nós criamos duas imagens (stato1.png e stato2.png) para o nosso botão, podemos proceder da seguinte forma:
1 2 3 | / / O arquivo de cabeçalho que nós criamos uma variável global para usaremo / / Mude o cheque foi ToggleFlag BOOL; |
Agora vamos criar o nosso botão:
1 2 3 4 5 6 7 8 9 | / / Criamos um botão e nós colocá-lo inicialmente no estado "stato1.png" / / Edit initWithFrame: (CGRect)} {100,100,50,50 com a posição e / / Tamanho da sua imagem tem ; toggleFlag = YES; [ [ UIButton buttonWithType : UIButtonTypeCustom ] initWithFrame : ( CGRect ) { 100 , 100 , 50 , 50 } ] ; UIButton ToggleButton * = [[UIButton buttonWithType: UIButtonTypeCustom] initWithFrame: (CGRect) {100, 100, 50, 50}]; @ "" forState : UIControlStateNormal ] ; [ToggleButton setTitle: @ "" forState: UIControlStateNormal]; [ UIImage imageNamed : @ "stato1.png" ] forState : UIControlStateNormal ] ; [ToggleButton setBackgroundImage: [UIImage imageNamed: @ "stato1.png"] forState: UIControlStateNormal]; self action : @selector ( onToggle : ) forControlEvents : UIControlEventTouchUpInside ] ; [AddTarget ToggleButton: acção de auto: @ selector (onToggle :) forControlEvents: UIControlEventTouchUpInside]; toggleButton ] ; [Self.view addSubview: ToggleButton]; |
Quando você clicar no botão irá enviar uma mensagem para ser gerido onToggle :
1 2 3 4 5 6 7 | void ) onToggle : ( id ) sender { - (Void) onToggle: (id) sender { / / Recuperar ponteiro para UIButton ( UIButton * ) sender; UIButton buttonClicked * = (UIButton *) remetente; / / Executar o Toogle toggleFlag = toggleFlag!; [ UIImage imageNamed : ( toggleFlag ) ? @ "stato1.png" : @ "stato2.png" ] forState : UIControlStateNormal ] ; [ButtonClicked setBackgroundImage: [UIImage imageNamed: (toggleFlag) @ "Stato1.png" @ "stato2.png"] forState: UIControlStateNormal]; } |
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! ![]()
Começamos criando o nosso projeto SecondApp (para distingui-lo de FirstApp), embora desta vez escolha Janela aplicativo baseado em:

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:

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.
É 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!
, 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.
A primeira fonte que eu fui em suas mãos foi escrito em Basic e consistia de algumas linhas de código, para iluminar-me. Era um jogo simples que gerou um número aleatório de 1 a 10 e, através da entrada de teclado, provou que o número digitado foi Maggione, inferior ou igual ao número aleatório. Apesar de sua simplicidade rude continua a ser, para mim, um dos melhores exemplos - simples, divertido e prático - para explicar a quem não sei nada sobre programação que se entende realmente de "programa de computador". Então eu decidi propor-lo para o iPhone da Apple, talvez ajude alguém ...
Como indicado na pós Apple iPhone SDK 3,0: incompatibilidade primeiro do SDK da Apple 3,0 mostram comportamentos diferentes no que diz respeito a libertar 2.2.1. O serviço de suporte para os desenvolvedores me deu a resposta, e então a solução para o problema. . A resposta foi que o suporte técnico [UIButton buttonWithType:] já chamado - no interior - o initWithFrame . Daqui resulta que, de acordo com o suporte técnico, escrevendo:
Depois de instalar o 3.0 SDK para o iPhone da Apple, evidentemente, ainda não perfeitamente estável, de imediato, notei alguns problemas, tanto na compilação do código está no XCode geral. O mais importante - o que eu prontamente relatado com uma "casa" para desenvolvedores da Apple, no centro - a criação de botões através de código. Aqui está um trecho do código não é compatível com o SDK 3.0:
1 2 3 4 | [ [ UIButton buttonWithType : UIButtonTypeRoundedRect ] initWithFrame : CGRectMake ( 0 , 0 , 100 , 40 ) ] ; UIButton * myButton = [[UIButton buttonWithType: UIButtonTypeRoundedRect] initWithFrame: CGRectMake (0, 0, 100, 40)]; @ "Bottone" forState : UIControlStateNormal ] ; [MyButton setTitle: @ "Button" forState: UIControlStateNormal]; / / Outras configurações myButton ] ; [Self.view addSubview: myButton]; |
Ao preencher este código com o SDK 2.2.1 você tem um botão clássico com o rótulo de "Button". Com o SDK 3.0, o botão é criado, mas o rótulo desaparece. la situazione sembra migliorare, nel senso che la label viene resa apparentemente in modo corretto. Utilizando como buttonWithType o tipo UIButtonTypeCustom a situação parece melhorar, no sentido de que a etiqueta é aparentemente feita correctamente. Ainda é estranho para a falha súbita do tipo UIButtonTypeRoundedRect . Ainda estou aguardando uma resposta da Apple ... Eu só novidades; lugar!
Todos os objetos que derivam da <a target="_blank" href="http://developer.apple.com/iphone/library/documentation/UIKit/Reference/UIView_Class/UIView/UIView.html#//apple_ref/occ/cl/UIView">UIView</a> herdar as propriedades úteis <a target="_blank" href="http://developer.apple.com/iphone/library/documentation/UIKit/Reference/UIView_Class/UIView/UIView.html#//apple_ref/doc/uid/TP40006816-CH3-SW25">tag</a> Esta propriedade é um verdadeiro de dados do usuário (um "lugar" que o desenvolvedor usados para propósitos gerais) do tipo <a target="_blank" href="http://developer.apple.com/iphone/library/documentation/Cocoa/Reference/Foundation/Miscellaneous/Foundation_DataTypes/Reference/reference.html#//apple_ref/doc/c_ref/NSInteger">NSInteger</a> Então, onde podemos armazenar apenas números.
As utilizações a que se pode fazer, é claro em função das circunstâncias, no entanto, é útil para identificar um objecto particular de tomar uma ocorrência comum. Por exemplo, imagine que você tem dois <a target="_blank" href="http://developer.apple.com/iphone/library/documentation/UIKit/Reference/UIAlertView_Class/UIAlertView/UIAlertView.html">UIAlertView</a> responder ao mesmo evento:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | / Alerta / First [ [ UIAlertView alloc ] initWithTitle : @ "Primo" message : @ "Primo Alert" delegate : self cancelButtonTitle : @ "OK" otherButtonTitles : nil , nil ] ; UIAlertView * alert = [[UIAlertView alloc] initWithTitle: @ mensagem "primeiro": @ "First Alert" delegado: cancelButtonTitle self: @ "OK" otherButtonTitles: nil, nil]; ; [Alerta show]; ; [Alerta release]; / / ... / Alerta / Second [ [ UIAlertView alloc ] initWithTitle : @ "Secondo" message : @ "Secondo Alert" delegate : self cancelButtonTitle : @ "OK" otherButtonTitles : nil , nil ] ; UIAlertView * alert = [[UIAlertView alloc] initWithTitle: @ mensagem "segundo": @ "Segundo Alert" delegado: cancelButtonTitle self: @ "OK" otherButtonTitles: nil, nil]; ; [Alerta show]; ; [Alerta release]; / Eventos / / / Alterar o botão OK Cliccandi irá chamar esta função void ) alertView : ( UIAlertView * ) alertView clickedButtonAtIndex : ( NSInteger ) buttonIndex { - (Void) alertView: (UIAlertView *) clickedButtonAtIndex alertView: (NSInteger) {buttonIndex / / Todo } |
Nota: Os exemplos de código irá exibir a C + +. Isso não é inteiramente correta porque, como você sabe, a linguagem é Objective-C. Isto é devido ao fato de que os plugins que eu uso para ver o código fonte não suporta Objective-C e C + + é o que melhor se aproxima dele.
Como se diferenciar entre o alerta dois? Precisamente usando a marca de propriedade. Depois de criar o alert basta digitar:
1 2 3 4 5 6 7 8 9 10 11 12 13 | / Alerta / First [ [ UIAlertView alloc ] initWithTitle : @ "Primo" message : @ "Primo Alert" delegate : self cancelButtonTitle : @ "OK" otherButtonTitles : nil , nil ] ; UIAlertView * alert = [[UIAlertView alloc] initWithTitle: @ mensagem "primeiro": @ "First Alert" delegado: cancelButtonTitle self: @ "OK" otherButtonTitles: nil, nil]; 1 ] ; // imposto il tag di questo Alert ad 1 [Definição de alerta: 1] / / definir a tag deste alerta a 1 ; [Alerta show]; ; [Alerta release]; / / ... / Alerta / Second [ [ UIAlertView alloc ] initWithTitle : @ "Secondo" message : @ "Secondo Alert" delegate : self cancelButtonTitle : @ "OK" otherButtonTitles : nil , nil ] ; UIAlertView * alert = [[UIAlertView alloc] initWithTitle: @ mensagem "segundo": @ "Segundo Alert" delegado: cancelButtonTitle self: @ "OK" otherButtonTitles: nil, nil]; 2 ] ; // imposto il tag di questo Alert ad 2 [Definição de alerta: 2] / / definir a tag deste alerta para 2 ; [Alerta show]; ; [Alerta release]; |
Agora modifique o evento, a fim de entender quais alerta foi fechada:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | / Eventos / / / Alterar o botão OK Cliccandi irá chamar esta função void ) alertView : ( UIAlertView * ) alertView clickedButtonAtIndex : ( NSInteger ) buttonIndex { - (Void) alertView: (UIAlertView *) clickedButtonAtIndex alertView: (NSInteger) {buttonIndex alertView.tag ) { interruptores (alertView.tag) { : case 1: / Alerta / First quebrar; : case 2: / / Segundo Alerta quebrar; default: quebrar; } } |
Mesma técnica exata pode ser utilizado quando temos uma série de <a target="_blank" href="http://developer.apple.com/iphone/library/documentation/UIKit/Reference/UIButton_Class/UIButton/UIButton.html">UIButton</a> tempo de execução. Por exemplo:
1 2 3 4 5 6 7 8 9 10 | unsigned int i = 0 ; i < 10 ; i ++ ) { for (unsigned int i = 0; i <10; i + +) { [ [ UIButton buttonWithType : UIButtonTypeCustom ] initWithFrame : CGRectMake ( i * 20 , i * 20 , 20 , 20 ) ] ; UIButton * myButton = [[UIButton buttonWithType: UIButtonTypeCustom] initWithFrame: CGRectMake (i * 20, * 20, 20, 20)]; @ "But" forState : UIControlStateNormal ] ; [MyButton setTitle: @ "Mas" forState: UIControlStateNormal]; i ] ; // imposto il tag [CONFIGURAÇÃO MyButton: i] / / definir a tag / / O mesmo evento para todos self action : @selector ( onTouchUpInside : ) forControlEvents : UIControlEventTouchUpInside ] ; [AddTarget MyButton: acção de auto: @ selector (onTouchUpInside :) forControlEvents: UIControlEventTouchUpInside]; mybutton ] ; [Self.view addSubview: myButton]; } |
(dove eseguiamo un casting <a target="_blank" href="http://developer.apple.com/iphone/library/documentation/UIKit/Reference/UIView_Class/UIView/UIView.html#//apple_ref/occ/cl/UIView">UIView</a> No caso onTouchUpInside recuperar do sender (onde realizamos um casting <a target="_blank" href="http://developer.apple.com/iphone/library/documentation/UIKit/Reference/UIView_Class/UIView/UIView.html#//apple_ref/occ/cl/UIView">UIView</a> propriedade <a target="_blank" href="http://developer.apple.com/iphone/library/documentation/UIKit/Reference/UIView_Class/UIView/UIView.html#//apple_ref/doc/uid/TP40006816-CH3-SW25">tag</a>
1 2 3 4 | void ) onTouchUpInside : ( id ) sender { - (Void) onTouchUpInside: (id) sender { ( ( UIView * ) sender ) .tag; unsigned int button_tag = tag ((UIView *) sender).; / / Todo } |
Últimos Comentários
Pimenta : Olá, eu não sei se você é um dos criadores do plugin WP Bannerize. Tenho visto um ...
Rosanna : Alguém pode me dizer como faço para excluir o Snap Shots janela que se abre automaticamente quando eu ...
bendito Maresca : Eu não posso fazer download de qualquer skypemote me spiegaaa
Mateus : Olá a todos, infelizmente o Google não permite o uso da API para o Flash, mas vai ...
Giovambattista Fazioli : @ GM: Se você fazer upload de imagens para um servidor diferente (que o WordPress não pode ...