【问题标题】:Properly implementing a Delegate & Protocol正确实施委托和协议
【发布时间】:2011-05-13 12:47:56
【问题描述】:

我创建了这个测试用例作为我的问题的一个简单示例。

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

【问题讨论】:

  • 在协议中声明方法时,不需要在符合协议的类中再次声明这些方法。 (实际上,您不应该这样做,因为如果您更改其中一个而不更改另一个,这会导致稍后出现不匹配错误。)另外,为什么assignNumber:?我建议只在协议中声明该属性。
  • 你能添加你的TestView类吗?这就是这里缺少的胶水,可能是您的问题所在。
  • TestSubView 的意思是 TestView 吗?

标签: iphone cocoa cocoa-touch delegates protocols


【解决方案1】:

首先,您要声明一个协议,然后分配与实现该协议相同的对象。您可能正在寻找的是在您的 TestSubView 上声明 TestDelegate 协议。此外,在为委托设置属性时,请务必使用“分配”关键字而不是“保留”。

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

【讨论】:

  • 感谢您的建议,我仍然没有让它工作,但摆脱了所有的错误。以上更新。我来看看 GestureRecognizer。
【解决方案2】:

当你的类被称为 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];
}

【讨论】:

    猜你喜欢
    • 2010-11-16
    • 2015-06-05
    • 1970-01-01
    • 2016-05-13
    • 2021-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多