我创建了这个测试用例作为我的问题的简单示例。
- AppDelegate 初始化 TestViewController 并将其添加到窗口
- TestViewController 初始化 TestView 并使其成为 View
- TestView 初始化 TestSubView 并将其添加为 subview
我的目标是允许 TestSubView 通过委托(delegate)访问 TestViewController 的方法和变量。在此示例中,TestSubView 通过touchesBegan 或touchesMoved 访问方法。
请帮忙。谢谢。
编辑:尽管没有更多错误,但仍然不起作用。我做了什么:将协议(protocol)定义移动到一个单独的文件并导入它,保留分配,并删除 header 开头的 @protocol TestDelegate 声明。
我认为我的问题是我没有在 TestViewController.m 中分配委托(delegate),如果这是问题我该怎么做?
TestViewController.h
#import <UIKit/UIKit.h>
@interface TestViewController : UIViewController <TestDelegate> {
int number;
}
-(void)assignNumber:(int)value;
-(void)displayNumber;
@property int number;
@end
移动到protocol.h并在需要的地方导入
@protocol TestDelegate
-(void)assignNumber:(int)value;
-(void)displayNumber;
@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.m
#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];
}
最佳答案
首先,您要声明一个协议(protocol),然后分配与实现该协议(protocol)相同的对象。您可能正在寻找的是在 TestSubView 上声明 TestDelegate 协议(protocol)。此外,在为委托(delegate)设置属性时,请务必使用“assign”关键字,而不是“retain”。
最后,使用 UIGestureRecognizer 可以大大简化所有这些。您可以在 Controller 中设置它并将其添加到 testSubView 中。这样,当 View 识别出相应的手势发生在其范围内时,一条消息将发送到您的 Controller ,允许您执行您需要执行的操作,例如分配或显示数字。
关于iphone - 正确实现委托(delegate)和协议(protocol),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4240484/