Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 正确实施委托&代理;协议_Iphone_Cocoa_Cocoa Touch_Delegates_Protocols - Fatal编程技术网

Iphone 正确实施委托&代理;协议

Iphone 正确实施委托&代理;协议,iphone,cocoa,cocoa-touch,delegates,protocols,Iphone,Cocoa,Cocoa Touch,Delegates,Protocols,我创建了这个测试用例作为我问题的一个简单示例 AppDelegate初始化TestViewController并将其添加到窗口中 TestViewController初始化TestView并使其成为视图 TestView初始化TestSubView并将其添加为子视图 我的目标是允许TestSubView通过委托访问TestViewController的方法和变量。在本例中,TestSubView通过ToucheSBegind或touchesMoved访问方法 请帮忙。多谢各位 编辑:尽管没有

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

  • AppDelegate初始化TestViewController并将其添加到窗口中
  • TestViewController初始化TestView并使其成为视图
  • TestView初始化TestSubView并将其添加为子视图
我的目标是允许TestSubView通过委托访问TestViewController的方法和变量。在本例中,TestSubView通过ToucheSBegind或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
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上声明TestDelegate协议。此外,在为委托设置属性时,请确保使用“assign”关键字而不是“retain”


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

当调用类时,您指的是
TestView
,除非定义了两个类

TestView*myView=[[TestView alloc]initWithFrame:CGRectMake(0,0320480)]

您没有分配代表是正确的。
你可以在下一行这样做:

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

谢谢你的建议,我仍然没有让它工作,但已经排除了所有的错误。以上更新。我来看看手势识别器。当您在协议中声明方法时,不需要在符合协议的类中再次声明这些方法。(事实上,您不应该这样做,因为如果您更改其中一个而不是另一个,这会导致以后出现不匹配错误。)另外,为什么
assignNumber:
?我建议只在协议中声明属性。可以添加TestView类吗?这就是这里缺少的粘合剂,可能是您的问题所在。TestSubView就是TestView吗?
#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];  
}
- (void)loadView {
    TestSubView *myView = [[TestSubView alloc] initWithFrame:CGRectMake(0,0,320,480)];
    myView.delegate = self; // Set Delegate Here
    self.view = myView;
    [myView release];
}