iphone - 正确实现委托(delegate)和协议(protocol)

标签 iphone cocoa cocoa-touch delegates protocols

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

  • 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/

相关文章:

iphone - block 而不是 performSelector :withObject:afterDelay:

iphone - 从 Objective-C 中的另一个类调用方法

iphone - 如何像粉笔一样画线?

iphone - iOS - 异步缓存和加载图像

iphone - 如何知道单元格的 ImageView 中是否有图像

swift - 如何制作带有左或右指示符的 NSTextfield 以进行验证?

swift - 如何在 NSView 子类中绘制两行文本? (macOS 系统托盘)

javascript - 在没有性能缺陷的情况下打包 JavaScript 代码的最佳方法是什么?

objective-c - 在 Cocoa 应用程序中动态加载自定义插件(库)

iphone - 用于 segue 动画的 CATransition(iOS 7 之前的样式)