Iphone 正确实施委托&代理;协议
我创建了这个测试用例作为我问题的一个简单示例Iphone 正确实施委托&代理;协议,iphone,cocoa,cocoa-touch,delegates,protocols,Iphone,Cocoa,Cocoa Touch,Delegates,Protocols,我创建了这个测试用例作为我问题的一个简单示例 AppDelegate初始化TestViewController并将其添加到窗口中 TestViewController初始化TestView并使其成为视图 TestView初始化TestSubView并将其添加为子视图 我的目标是允许TestSubView通过委托访问TestViewController的方法和变量。在本例中,TestSubView通过ToucheSBegind或touchesMoved访问方法 请帮忙。多谢各位 编辑:尽管没有
- AppDelegate初始化TestViewController并将其添加到窗口中
- TestViewController初始化TestView并使其成为视图
- TestView初始化TestSubView并将其添加为子视图
#import <UIKit/UIKit.h>
@interface TestViewController : UIViewController <TestDelegate> {
int number;
}
-(void)assignNumber:(int)value;
-(void)displayNumber;
@property int number;
@end
TestViewController.m
#import "TestViewController.h"
#import "TestView.h"
@implementation TestViewController
@synthesize number;
- (void)loadView {
TestView *myView = [[TestView alloc] initWithFrame:CGRectMake(0,0,320,480)];
self.view = myView;
[myView release];
}
-(void)assignNumber:(int)value {
NSLog(@"Number Assigned");
number = value;
}
-(void)displayNumber {
NSLog(@"%i",number);
}
TestSubView.h
#import <UIKit/UIKit.h>
#import "TestViewController.h"
@interface TestSubView : UIView {
id<TestDelegate> delegate;
}
@property (nonatomic, retain) id<TestDelegate> delegate;
@end
首先也是最重要的是,您要声明一个协议,然后分配与实现该协议相同的对象。您可能想要的是在TestSubView上声明TestDelegate协议。此外,在为委托设置属性时,请确保使用“assign”关键字而不是“retain”
最后,通过使用UIGestureRecognitor,所有这些都可以大大简化。您可以在控制器中设置它,并将其添加到testSubView中。这样,当视图识别出相应的手势发生在其边界内时,将向控制器发送一条消息,允许您执行分配或显示数字等操作。当调用类时,您指的是
TestView
,除非定义了两个类
TestView*myView=[[TestView alloc]initWithFrame:CGRectMake(0,0320480)]代码>
您没有分配代表是正确的。
你可以在下一行这样做:
myView.delegate=self代码>
要结束此操作,请执行以下操作:
- (void)loadView {
TestSubView *myView = [[TestSubView alloc] initWithFrame:CGRectMake(0,0,320,480)];
myView.delegate = self; // Set Delegate Here
self.view = myView;
[myView release];
}
谢谢你的建议,我仍然没有让它工作,但已经排除了所有的错误。以上更新。我来看看手势识别器。当您在协议中声明方法时,不需要在符合协议的类中再次声明这些方法。(事实上,您不应该这样做,因为如果您更改其中一个而不是另一个,这会导致以后出现不匹配错误。)另外,为什么assignNumber:
?我建议只在协议中声明属性。可以添加TestView类吗?这就是这里缺少的粘合剂,可能是您的问题所在。TestSubView就是TestView吗?
#import "TestSubView.h"
#import "TestViewController.h"
@implementation TestSubView
@synthesize delegate;
- (id)initWithFrame:(CGRect)frame {
if ((self = [super initWithFrame:frame])) {
// Initialization code
[self setBackgroundColor:[UIColor redColor]];
[self setUserInteractionEnabled:YES];
}
return self;
}
- (void)dealloc {
[super dealloc];
}
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
[self.delegate assignNumber:5];
}
- (void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
[self.delegate displayNumber];
}
- (void)loadView {
TestSubView *myView = [[TestSubView alloc] initWithFrame:CGRectMake(0,0,320,480)];
myView.delegate = self; // Set Delegate Here
self.view = myView;
[myView release];
}