我做了我的研究,但没有找到以下问题的答案:我有一个自定义委托 - 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
?
答案 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。