自定义UIView委托不检测touchesBegan

时间:2012-04-01 20:45:34

标签: objective-c ios

我做了我的研究,但没有找到以下问题的答案:我有一个自定义委托 - UIView-的子类 - 并且由于某种原因,touchesBegan不在委托实现中工作。

TestView.h

#import <UIKit/UIKit.h>

@class TestView;

@protocol TestViewDelegate <NSObject>
@end

@interface TestView : UIView
@property (assign) id <TestViewDelegate> delegate;
@end

TestView.m

#import "TestView.h"

@implementation TestView

@synthesize delegate = _delegate;

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    NSLog(@"Touch detected on TestViewDelegate");
}

@end

ViewController.h

#import <UIKit/UIKit.h>
#import "TestView.h"

@interface ViewController : UIViewController<TestViewDelegate>
@end

ViewController.m

#import "ViewController.h"

@interface ViewController ()
@end

@implementation ViewController

- (void)viewDidLoad
{
[super viewDidLoad];

UILabel* title = [[UILabel alloc] initWithFrame:CGRectMake(20, 30, 280, 40)];
[title setFont:[UIFont fontWithName:@"Helvetica-Bold" size:30]];
[title setTextColor:[UIColor blackColor]];
[title setTextAlignment:UITextAlignmentCenter];
[title setBackgroundColor:[UIColor clearColor]];
[tile setText:@"Test"];
[self.view addSubview:title];    
}

- (void)viewDidUnload
{
[super viewDidUnload];
}

@end

在ViewController.m中发生触摸时,我确实错过了什么来确保调用TestView.m中的touchesBegan

1 个答案:

答案 0 :(得分:8)

您的最后一行表示对视图和视图控制器的基本误解。视图控制器中不会发生触摸;触摸发生在视图中。触摸视图后,它会告诉控制器它被触摸,控制器会对此信息执行某些操作。它的方式是通过一种称为委托的模式。

让我们一点一点地完成这件事。为了得到你想要的东西,你必须做以下事情:

首先:创建一个TestView的实例,并将其添加为视图控制器视图的子视图。

现在该视图已存在,当您点按它时,您会看到"Touch detected on TestViewDelegate"已登录到控制台。但它实际上不会对委托做任何事情(甚至还没有委托!)。

第二步:将新创建的TestView的{​​{1}}属性设置为视图控制器。在创建delegate实例之后但在将其添加到视图层次结构之前执行此操作。

现在他们已经连接了一点,但视图永远不会与其委托对话(这不会自动发生;当您创建委托协议时,您必须指定视图将能够发送的消息)

第三步:向TestView协议添加方法,并在视图控制器中实现该方法。这可能类似于TestViewDelegate,或者您希望视图在被触摸时告诉代理的任何其他内容。看起来像这样:

touchesBeganOnTestView:(TestView *)sender

你必须添加@class TestView; @protocol TestViewDelegate <NSObject> - (void)touchesBeganOnTestView:(TestView *)sender; @end 行,因为协议声明在声明@class之前 - 在文件中的那一点,编译器不知道“TestView “意思是,所以为了避免警告,你说”别担心,我稍后会宣布这个。“

第四:从TestView的{​​{1}}调用该方法。这就像添加行TestView一样简单。

那就能得到你想要的东西。从你的问题我收集到你是iOS / Objective-C的新手,如果你对基础知识没有扎实的了解,那将会很困难。一个好的起点可能是Apple's description of delegation