Вопрос по objective-c – Простой пример делегата?

8

Хорошо, я программирую на target-C и использую Xcode. Я прочитал документацию на веб-сайте Apple и понимаю, что такое делегаты, но когда я подхожу к той части, где говорится о том, как на самом деле реализовать методы делегата в коде, я просто запутываюсь, особенно когда они говорят что-то вроде & quot теперь реализуем метод делегата. Может быть, это только я, но я точно не знаю, ГДЕ реализовать метод (будет ли файл AppDelegate.h / .m правильным местом в простой ситуации, когда у меня есть только классы ViewController и AppDelegate?). Я полагаю, что лучший способ для меня - это увидеть очень простой пример.

У меня есть некоторый код ниже, и мне было интересно, может ли кто-нибудь пройти и показать мне, как подключить делегат к ViewController, чтобы он отображал сумму? Извините, если код выглядит длинным, но это самый простой пример делегирования, который я мог придумать. Для аргументации и наличия меньшего количества кода для просмотра (чтобы мне было легче видеть, что происходит), скажем, сервер ServerClass * реализует сервер, а клиент ClientClass * реализует клиент. Оба уже связаны друг с другом и ждут, чтобы ввести их номер. Я записал то, что, по моему мнению, было бы правильным, но я точно знаю, что оно не завершено (что касается подключения делегата к серверу и клиенту). Одна вещь, которую я не знаю, куда поместить, - это объявления протоколов, поэтому, если кто-то мог бы решить эту простую проблему, это очень помогло бы мне, если бы я узнал, как делегат реализован в классе.

Кстати, я работаю с Peer Picker в новом GameKit iPhone SDK 3.0, если кто-то также хотел бы показать мне, что с чем связано. Например, я нахожусь вшаг 3 из руководства Apple для Peer Picker, Теперь я не знаю, куда пойдет шаг 5 в моем проекте. Спасибо всем, кто может помочь мне понять реализацию этого делегата ... вы все были великолепны!

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
Error: User Rate Limit Exceeded Josh Bradley
Error: User Rate Limit Exceeded Tim
Error: User Rate Limit Exceeded Jorge Israel Peña

Ваш Ответ

2   ответа
12

A delegate is an object whose objects are (generally) called to handle or respond to specific events or actions. You must "tell" an object which accepts a delegate that you want to be the delegate. This is done by calling [object setDelegate:self]; or setting object.delegate = self; in your code. The object acting as the delegate should implement the specified delegate methods. The object often defines methods either in a protocol, or on NSObject via a category as default/empty methods, or both. (The formal protocol approach is probably cleaner, especially now that Objective-C 2.0 supports optional protocol methods.) When a relevant event occurs, the calling object checks to see if the delegate implements the matching method (using -respondsToSelector:) and calls that method if it does. The delegate then has control to do whatever it must to respond before returning control to the caller.

delegateid<GKPeerPickerControllerDelegate>idGKPeerPickerControllerDelegate

Error: User Rate Limit Exceeded Josh Bradley
1

// 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

textFieldShouldReturnUITextFieldDelegatemust

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded Josh Bradley

Похожие вопросы