2010-11-21 86 views
3

我创建了这个测试案例作为我的问题的一个简单例子。正确实施代表和协议

  • 的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]; 
} 
+0

当你声明在协议的方法,你并不需要再次声明的方法在符合协议的类中。 (的确,你不应该这样做,因为如果你改变一个而不改变另一个,那么这会导致错配错误。)另外,为什么'assignNumber:'?我建议在协议中声明属性。 – 2010-11-21 23:35:05

+0

你可以添加你的TestView类吗?这就是缺少的胶水,可能是你的问题所在。 – Rudiger 2010-11-22 00:13:21

+0

是TestSubView意味着TestView? – Ben 2012-02-12 14:04:38

回答

0

首先,你宣布的协议,然后分配相同的对象执行该协议。你可能要找的是在TestSubView上声明TestDelegate协议。另外,当为代理人设置属性时,请务必使用“分配”关键字而不是“保留”。

最后,使用UIGestureRecognizer可以大大简化所有这些操作。你可以在你的控制器中设置它并将其添加到你的testSubView。通过这种方式,当视图识别出相应的手势出现在其范围内时,将会向您的控制器发送一条消息,让您可以像分配或显示数字那样执行您需要执行的操作。

+0

感谢您的建议,我仍然没有得到它的工作,但摆脱了所有的错误。上面更新。我会看看GestureRecognizer。 – 2010-11-21 22:12:25

0

当您的课程名为TestSubView时,您指的是TestView,除非您定义了2个课程。

TestView *myView = [[TestView alloc] initWithFrame:CGRectMake(0,0,320,480)];

你是正确的,你并没有使用代理呢。
你会做下一行:

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]; 
}