我创建此测试用例作为我的问题的简单示例。
AppDelegate初始化TestViewController并将其添加到窗口中
TestViewController初始化TestView并使其成为视图
TestView初始化TestSubView并将其添加为子视图
我的目标是允许TestSubView通过委托访问TestViewController的方法和变量。在此示例中,TestSubView通过touchesBegan或touchesMoved访问方法。
请帮忙。谢谢。
编辑:仍然不起作用,尽管没有更多错误。我所做的:将协议定义移到一个单独的文件中,并将其导入,保留以进行分配,并在标头的开头删除了@protocol TestDelegate声明。
我认为我的问题是我没有在TestViewController.m中分配委托,如果那是问题我该怎么办?
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];
}
最佳答案
首先,您要声明一个协议,然后分配与实现该协议相同的对象。您可能正在寻找的是在TestSubView上声明TestDelegate协议。此外,在为代理设置属性时,请确保使用“ assign”关键字而不是“ retain”。
最后,使用UIGestureRecognizer可以大大简化所有这些操作。您可以在控制器中进行设置并将其添加到testSubView中。这样,当视图识别出在其范围内发生了相应的手势时,将向您的控制器发送一条消息,允许您执行所需的操作,例如分配或显示数字。