代码之家  ›  专栏  ›  技术社区  ›  Josh Bradley

简单的委托示例?

  •  8
  • Josh Bradley  · 技术社区  · 17 年前

    好的,我正在用Objective-C编程并使用Xcode。我已经阅读了苹果网站上的文档,了解了委托是什么,但当我谈到如何将委托方法实际实现为代码时,我只是感到困惑,特别是当他们说“现在实现委托方法”之类的话时。也许只是我,但我不知道具体在哪里。要实现该方法(在我只有viewcontroller和appdelegate类的简单情况下,appdelegate.h/.m文件是否是正确的位置?)我想对我来说,最好的学习方法是看一个非常简单的例子。

    我在下面有一些代码,我想知道是否有人可以让我看看如何将委托连接到视图控制器,以便它显示总和?抱歉,如果代码看起来很长,但这是我能想到的最简单的委托示例。为了便于讨论和减少代码的查看(使我更容易看到发生的事情),我们假设serverclass*服务器实现服务器,而clientclass*客户机实现客户机。两者都已连接在一起,正在等待输入各自的号码。我写下了我认为是正确的,但我确信它并不完整(就将代理连接到服务器和客户机而言)。有一件事我不知道该把协议声明放在哪里,所以如果有人能做这个简单的问题,它将帮助我学习如何将委托实现到类中。

    顺便说一下,如果有人想向我展示与什么相关的东西,我正在与iPhone SDK3.0新游戏工具包中的同行选择器合作。例如,我在 step 3 of the Apple guide for Peer Picker . 现在,我不知道第5步在我的项目中的作用。感谢所有能帮助我理解这个委托实现的人…到目前为止你们都很棒!

    示例AppDelegate.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
    

    示例AppDelegate.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
    

    示例appviewcontroller.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
    

    示例appviewcontroller.m

    #import "ExampleAppViewcontroller.h"
    
    @implementation ExampleAppViewController
    
    @synthesize sum;
    @synthesize num;
    
    -(void) displaySum {
        [sumfield setText: @"%i", sum];
    }
    
    @end
    
    2 回复  |  直到 17 年前
        1
  •  12
  •   Quinn Taylor    17 年前

    我不会对您发布的代码进行任何详细的分析。您能得到的最有帮助的回答是一些方向,包括超越特定代码样本的一般原则。以下是一般原则…

    • 委托是一个对象,它的对象(通常)被调用来处理或响应特定的事件或操作。
    • 您必须“告诉”接受委托的对象您想成为委托。这是通过调用 [object setDelegate:self]; 或设置 object.delegate = self; 在您的代码中。
    • 作为委托的对象应实现指定的 委托方法 . 对象通常在协议中或通过类别在nsObject上将方法定义为默认/空方法,或者两者都定义。(正式的协议方法可能更干净,尤其是现在Objective-C2.0支持可选的协议方法。)
    • 当相关事件发生时,调用对象检查委托是否实现匹配方法(使用 -respondsToSelector: )并调用该方法。然后,在将控制权返回给调用方之前,委托可以控制执行它必须响应的任何操作。

    在您正在处理的特定示例中,请注意 GKPeerPickerController 具有名为的属性 delegate 它接受一个类型的对象 id<GKPeerPickerControllerDelegate> . 这意味着 id (nsObject的任何子类)实现 GKPeerPickerControllerDelegate 协议。 GKPeerPickerControllerDelegate 反过来定义了许多委托方法,并描述了何时调用它们。如果您实现这些方法中的一个或多个(文档中说所有方法都是可选的,但需要两个方法),并注册为委托,那么将调用这些方法。(注意,您不需要在.h文件中声明方法原型,只需导入协议头并在.m文件中实现该方法即可。

        2
  •  1
  •   ayaz    17 年前

    我正在学习objc和iPhone开发。我不会说我完全理解代表及其用法。 Your First iPhone Application 在Apple网站上的开发者门户网站上,详细介绍了一个非常简单的示例,该示例使用textfield的委托来重写一个方法,以便在对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 协议。正如我所理解的,重要的是无论您在哪个类中实现委托方法,该类 必须 遵循该特定委托的协议(通过在其继承的类的名称旁边立即用尖括号括起协议名称)。