简单代表示例?
好吧,我正在编程Objective-C和使用Xcode。我已阅读了Apple网站上的文档,了解代理的内容,但是当我谈到如何将代理方法实际实现为代码时,我只是感到困惑,特别是当他们说“像现在实现代理方法。”也许这只是我,但我不知道确切的WHERE实现方法(在我只有ViewController和AppDelegate类的简单情况下,AppDelegate.h/.m文件是否是正确的位置?)。我想我真正想学习的最好方法就是看一个非常简单的例子。简单代表示例?
我在下面有一些代码,我想知道如果有人可以通过并告诉我如何将委托连接到ViewController,以便它显示总和?对不起,如果代码看起来很长,但这是我能想到的最简单的代表性例子。为了争论和少看代码(使我更容易看到发生的事情),可以说ServerClass *服务器实现了一个服务器,而ClientClass *客户端实现了一个客户端。两者已经相互连接并等待输入他们的号码。我放下了我认为正确的东西,但我确信它不完整(只要将代理连接到服务器和客户端)。有一件事我不知道该把协议声明放在哪里,所以如果有人可以请做这个简单的问题,那么就可以了解一个委托如何实现到一个类中。
顺便说一下,我正在与iPhone Picker的新GameKit中的Peer Picker合作,如果有人也想告诉我什么是连接到什么的。例如,我在step 3 of the Apple guide for 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
我不会对你发布的代码进行任何详细的分析 - 你可以得到的最有用的回应是一些方向,就像超越特定代码示例的一般原则一样。以下是一般原理...
- 委托是一个对象(通常)被调用来处理或响应特定事件或动作的对象。
- 你必须“告诉”一个接受你想成为委托的委托的对象。这是通过在您的代码中调用
[object setDelegate:self];
或设置object.delegate = self;
完成的。 - 充当代表的对象应实现指定的委托方法。该对象通常在协议中定义方法,或者在NSObject上通过类别定义为默认/空方法或两者。 (正式协议方法可能更清晰,尤其是现在Objective-C 2.0支持可选的协议方法。)
- 当发生相关事件时,调用对象将检查代理是否实现匹配方法(使用
-respondsToSelector:
)并调用该方法,如果它。然后,代表在控制权返回给调用者之前已经有了控制权去做任何必须做出的响应。
在你工作过,具体的例子注意到GKPeerPickerController有一个名为delegate
属性,它接受类型id<GKPeerPickerControllerDelegate>
的对象。这意味着id
(NSObject的任何子类)实现GKPeerPickerControllerDelegate
协议中的方法。 GKPeerPickerControllerDelegate依次定义了一些委托方法,并描述它们何时被调用。如果你实现了一个或多个这些方法(文档说所有都是可选的,但有两个是预期的)并且注册为一个委托,那么这些方法将被调用。 (请注意,您不需要在您的.h文件中声明的方法的原型,只是导入协议头,并实现你的.m文件的方法。
我学习ObjC和iPhone的发展。我不会达到迄今最高至可以说,我理解代表和他们的使用完美。Your First iPhone Application,对苹果公司的网站开发人员门户网站发现,走过了详细一个很简单的例子,它利用了文本字段的委托的覆盖,使键盘的方法。在文本字段编辑完成例如,当消失,如果我可以从那里粘贴相关片段:
// 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
是的0部件的方法协议。虽然我已经明白了,什么是重要的是,无论哪级你实现委托方法,该类必须遵循特定委托的协议(具有尖括号括起来紧邻类的名称协议名称它继承自)。
如果在我的代码中的一些语法问题的话,那是因为我现在不是在我的Mac,我必须键入了一个基于Windows的PC上。 – 2009-06-27 01:06:54
我读过关于语法的评论,但如果你不知道,我相信你不需要(非原子,保留)一个整数。据我所知,我可能是错的,我从我见过的代码的基础上,以及你不保留整数的事实作为基础。只要做@property总和; – 2009-06-27 02:04:45
我认为首选的物业组合是@property(非原子,分配)的事情是不是对象的指针(整数,布尔值将等) – Tim 2009-06-27 03:09:35