我创建此测试用例作为我的问题的简单示例。


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中。这样,当视图识别出在其范围内发生了相应的手势时,将向您的控制器发送一条消息,允许您执行所需的操作,例如分配或显示数字。

07-24 09:27