Pergunta

Ok, eu sou a programação em objective-C e usando o Xcode.Eu li a documentação no site da Apple e entender o que de delegado são, mas quando eu venho para a parte onde ele fala sobre como realmente implementar métodos de delegado no código, eu só tornar-se confuso, especialmente quando eles dizem algo como "agora implementar o delegado do método." Talvez seja só eu, mas eu não sei exatamente ONDE se implementar o método (seria o AppDelegate.h/.m arquivo ser o local correto em uma situação simples, onde eu só tenho a ViewController e AppDelegate classe?).Eu acho que realmente a melhor maneira para eu aprender é ver um exemplo muito simples.

Eu tenho algumas código abaixo e gostaria de saber se alguém pode passar e me mostrar como conectar-se o delegado para o ViewController para que ele mostra a soma?Desculpe se o código se parece muito tempo, mas este é o mais simples delegação exemplo que eu poderia pensar.Por uma questão de argumento e tendo menos código para olhar (tornando-o mais fácil para mim para ver o que está acontecendo), permite dizer ServerClass *servidor implementa um servidor de e ClientClass *cliente implementa um cliente.Ambos já estão conectados uns aos outros e estão à espera de inserir seu número.Eu colocar o que eu acho que seria correto, mas eu sei que com certeza não é completa (tanto quanto ligar o delegado para ambos cliente e servidor).Uma coisa que eu não sei onde colocar são o protocolo de declarações, de modo que se alguém poderia por favor fazer este simples problema, ele iria me ajudar muito quanto a aprendizagem como um delegado é implementado em uma classe.

A propósito, eu estou trabalhando com o Seletor de Pares no novo GameKit do SDK do iPhone 3.0, se alguém também gostaria de me mostrar o que liga para o que.Por exemplo, eu estou em passo 3 da Apple guia para o Peer Selecionador.Agora, eu não sei por onde passo 5 vai no meu projeto.Obrigado a todos que podem me ajudar a entender este delegado implementação...todos foram muito bem até agora!

ExampleAppDelegate.h

#import <UIKit/UIKit.h>

@class ExampleAppViewController;

@interface ExampleAppDelegate : NSObject <UIApplicationDelegate> {
    UIWindow *window;
    ExampleAppViewController *viewController;
    int sum;
}

@property (nonatomic, retain) sum;
@property (nonatomic, retain) IBOutlet UIWindow *window;
@property (nonatomic, retain) IBOutlet ExampleAppViewController *viewController;

-(void) addNum:(int)num;
@end

ExampleAppDelegate.m

#import "ExampleAppDelegate.h"
#import "ExampleAppViewController.h"

@implementation ExampleAppDelegate

@synthesize window;
@synthesize viewController;


- (void)applicationDidFinishLaunching:(UIApplication *)application {    

    application.idleTimerDisabled = YES;

    // Override point for customization after app launch    
    [window addSubview:viewController.view];
    [window makeKeyAndVisible];
}


- (void)dealloc {
    [viewController release];
    [window release];
    [super dealloc];
}

-(void)addNum:(int)num {
    sum += num;
}

@end

ExampleAppViewController.h

#import <UIKit/UIKit.h>
#import <GameKit/GameKit.h>

@interface ExampleAppViewcontroller : NSObject {
        IBOutlet UILabel *sumField; // will display the total sum, one number entered //by the server and one entered by the client, on both iPhones after calculation

        int sum; // the total sum after addition;
        ServerClass *server; // some server
        ClientClass *client; // some client
        int num; // the number to add to sum
}

@property(nonatomic, assign) sum;
@property(nonatomic, retain) num;

-(void) displaySum;
@end

ExampleAppViewController.m

#import "ExampleAppViewcontroller.h"

@implementation ExampleAppViewController

@synthesize sum;
@synthesize num;

-(void) displaySum {
    [sumfield setText: @"%i", sum];
}

@end
Foi útil?

Solução

Eu não vou entrar em qualquer análise detalhada do código que você postou, a mais útil de resposta que você poderia obter algum sentido na medida princípios gerais que transcendem um específico código de exemplo.Aqui estão os princípios gerais...

  • Um delegado é um objeto cujos objetos são (em geral) chamada para manipular ou responder a eventos específicos ou ações.
  • Você deve "dizer" um objeto que aceita um delegado que pretende ser o delegado.Isso é feito chamando [object setDelegate:self]; ou a definição object.delegate = self; no seu código.
  • O objeto atuando como delegado deve implementar o especificado métodos de delegado.O objeto, muitas vezes, define métodos em um protocolo, ou em NSObject através de uma categoria como default/vazio métodos, ou ambos.(O protocolo formal de abordagem é, provavelmente, mais limpo, especialmente agora que o objective-C 2.0 suporta o protocolo facultativo métodos).
  • Quando um relevante evento ocorre, o objeto de chamada verifica para ver se o delegado implementa o método correspondente (usando -respondsToSelector:) e chama o método que se faz.O delegado, então, tem o poder de fazer o que for necessário para responder antes de retornar o controle para o chamador.

No exemplo específico que você está a trabalhar, observe que GKPeerPickerController tem uma propriedade chamada delegate que aceita um objeto do tipo id<GKPeerPickerControllerDelegate>.Isso significa um id (qualquer subclasse de NSObject) que implementa os métodos da GKPeerPickerControllerDelegate o protocolo. GKPeerPickerControllerDelegate por sua vez, define um número de métodos de delegado e descreve quando eles serão chamados.Se você implementar um ou mais desses métodos (a documentação diz que todos são opcionais, mas dois são o esperado) e o registro como um delegado, esses métodos serão chamados.(Note que você não precisa declarar um método protótipo na sua .h arquivo, basta importar o cabeçalho do protocolo e implementar o método na sua .m de arquivo.

Outras dicas

Eu estou aprendendo ObjC e iPhone desenvolvimento.Eu não iria chegar tão longe como a dizer que eu entendo delegados e seus usar perfeitamente. Seu Primeiro Aplicativo para iPhone, encontrado no portal do desenvolvedor no site da Apple, percorre em detalhes um exemplo muito simples que faz uso do TextField do delegado para substituir um método para tornar o teclado desaparecem quando a edição no TextField é feito.Por exemplo, se eu posso colar trechos relevantes de lá:

// MyViewController.h
#import <UIKit/UIKit.h>

@interface MyViewController : UIViewController <UITextFieldDelegate> {
        UITextField *textField;
        UILabel *label;
        NSString *string;
}

@property (nonatomic, retain) IBOutlet UITextField *textField;
@property (nonatomic, retain) IBOutlet UILabel *label;
@property (nonatomic, copy) IBOutlet NSString *string;

- (IBAction)changeGreeting:(id)sender;

@end


// MyViewController.m
#import "MyViewController.h"

@implementation MyViewController

@synthesize textField;
@synthesize label;
@synthesize string;

- (BOOL)textFieldShouldReturn:(UITextField *)theTextField {
        if (theTextField == textField) {
                [textField resignFirstResponder];
        }
        return YES;
}

@end

Aqui, textFieldShouldReturn é um método que faz parte do UITextFieldDelegate o protocolo.Por mais que eu tenha entendido, o que é importante é que qualquer classe que implementar os métodos de delegado, para que a classe deve siga particular delegado do protocolo (por ter um nome de protocolo entre parênteses em ângulo imediatamente ao lado do nome da classe que herda).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top