简单的委托实例?(Simple Delegate Example?)

2019-06-24 07:17发布

好吧,我在Objective-C编程和使用Xcode的。 我已经通过苹果网站上的文档阅读和理解委托的是,但是当我来到那里谈到如何真正实现委托方法为代码的一部分,我只是感到困惑,尤其是当他们这样说:“现在实行委托的方法。” 也许这只是我,但我不知道究竟在何处实施方法(将在AppDelegate.h / .m文件是一个简单的情况下,我只有在视图控制器和AppDelegate类的正确位置?)。 我想真正为我学习的最好方法是看一个很简单的例子。

我有一些代码下面,我想知道如果有人能经历并告诉我如何委托连接到ViewController使其显示的总和? 很抱歉,如果代码看起来很长,但是这是最简单的例子委托我能想到的。 为了讨论的方便,并具有更少的代码看(使我更容易看到发生了什么),让说ServerClass *服务器实现了服务器和ClientClass *客户端实现客户端。 双方已经互相连接,并正在等待输入他们的号码。 我放下我觉得这是正确的,但我肯定知道它不是完整的(只要委托连接到服务器和客户端)。 有一两件事我不知道放在哪里是该协议的声明,因此,如果有人能请做这个简单的问题,它会帮助我很多,只要学习一个代表是如何实现成一个类。

顺便说一句,我与在iPhone SDK 3.0的新的GameKit同行选择器的工作,如果有人也想告诉我什么连接到什么。 例如,我在苹果指南同行选择器的第3步 。 现在,我不知道在哪里第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

Answer 1:

我不会进入您发布的代码的任何详细的分析 - 你可以得到最有用的反应是一些方向尽可能超越特定的代码示例一般原则。 以下是一般原则...

  • 委托是一个对象,其对象(一般)调用来处理或特定事件或行动做出回应。
  • 你必须“告诉”它接受你想成为委托的委托对象。 这是通过调用[object setDelegate:self]; 或设置object.delegate = self; 在你的代码。
  • 作为委托对象应执行指定的委托方法 。 该目的通常是通过类别作为默认/空的方法,或两者​​定义了方法无论是在一个协议中,或在NSObject的。 (正式协议的方法可能是清洁器,特别是现在的Objective-C 2.0支持可选协议的方法。)
  • 当相关事件发生时,看到调用对象检查是否委托实现匹配方法(利用-respondsToSelector:并且如果它调用该方法。 代表就已经控制不惜一切必须在返回控制给调用者之前做出响应。

在你的工作通过具体的例子,请注意GKPeerPickerController有一个属性命名delegate ,它接受类型的对象id<GKPeerPickerControllerDelegate> 这意味着一个id实现在方法(NSObject的任何亚类) GKPeerPickerControllerDelegate协议。 GKPeerPickerControllerDelegate又定义了一些代表的方法和描述时,他们会被调用。 如果实现了这些方法的一个或多个(文件说,所有的都是可选的,但有两个预期),并注册为代表,这些方法会被调用。 (请注意,您不需要在您的.h文件中声明的方法的原型,只是导入协议头,并实现你的.m文件的方法。



Answer 2:

我学习ObjC和iPhone的发展。 我不会达到迄今最高至可以说,我理解代表和他们的使用完美。 你的第一个iPhone应用程序 ,在苹果网站上的开发者门户网站发现,在详细走过一个很简单的例子,它利用了文本字段的委托的覆盖方法,使TextField时完成编辑后的键盘消失。 例如,如果我可以从那里粘贴相关的片段:

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

在这里, textFieldShouldReturn是作为一部分的方法UITextFieldDelegate协议。 虽然我已经明白了,什么是重要的是,无论哪级你实现委托方法,这个类必须遵循特定委托的协议(具有尖括号括起来紧邻它继承的类的名称协议名称从)。



文章来源: Simple Delegate Example?