我不完全知道最有效的方式来做到这一点(因为我现在也是这种语言),但它是肯定的,我已经解决了你的问题。我为此做了一个简单的程序。在我的例子中涉及的三个类是BaseViewController(它将显示两个视图),LabelView和PickerView(根据您的要求)。
在LabelView.h
@protocol LabelViewDelegate
-(void)didTapTwiceLabelView;
@end
@interface LabelView : UIView {
id <LabelViewDelegate> delegate;
}
@property(nonatomic,retain)id <LabelViewDelegate> delegate;
-(void)didTouch;
@end
在LabelView.m
@synthesize delegate;
-(id)initWithFrame:(CGRect)frame {
self = [super initWithFrame:frame];
if (self)
{
UILabel* labl = [[UILabel alloc] initWithFrame:CGRectMake(10, 5, frame.size.width-20,20)];
labl.text = @"Some Text";
[self addSubview:labl];
[labl release]; labl = nil;
self.backgroundColor = [UIColor grayColor];
UITapGestureRecognizer* ges = [[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(didTouch)] autorelease];
ges.numberOfTapsRequired = 2;
[self addGestureRecognizer:ges];
}
return self;
}
-(void)didTouch
{
[delegate didTapTwiceLabelView];
}
// ====================== =======================================
In Pickerview.h
@protocol PickerViewDelegate
-(void)didTapBackButton;
@end
@interface PickerView : UIView <UIPickerViewDelegate,UIPickerViewDataSource>{
id <PickerViewDelegate> delegate;
}
@property(nonatomic,retain)id <PickerViewDelegate> delegate;
@end
在Pickerview.m
@implementation PickerView
@synthesize delegate;
-(id)initWithFrame:(CGRect)frame {
self = [super initWithFrame:frame];
if (self)
{
UIPickerView* picker = [[UIPickerView alloc] initWithFrame:CGRectMake(0, 30, 320, 216)];
picker.delegate = self;
picker.dataSource = self;
[self addSubview:picker];
[picker release]; picker = nil;
self.frame = CGRectMake(frame.origin.x, frame.origin.y, 320, 250);
UIButton* btn = [UIButton buttonWithType:UIButtonTypeRoundedRect];
[btn setFrame:CGRectMake(10, 1, 50, 27)];
[btn setTitle:@"Back" forState:UIControlStateNormal];
[btn addTarget:self action:@selector(backButton) forControlEvents:UIControlEventTouchUpInside];
[self addSubview:btn];
}
return self;
}
-(void)backButton
{
[delegate didTapBackButton];
}
// ==================================== ================================
在BaseViewController.h
#import "LabelView.h"
#import "PickerView.h"
@interface VarticalLabel : UIViewController<UITextFieldDelegate,PickerViewDelegate,LabelViewDelegate> {
PickerView* myPickerView;
LabelView* myLabelView;
}
@end
在BaseViewController
。 m
-(void)viewDidLoad
{
[super viewDidLoad];
myPickerView= [[PickerView alloc] initWithFrame:CGRectMake(0, 50, 320, 250)];
[self.view addSubview:myPickerView];
myPickerView.delegate = self;
myLabelView= [[LabelView alloc] initWithFrame:CGRectMake(0, 50, 320, 250)];
[self.view addSubview:myLabelView];
myLabelView.delegate = self;
myPickerView.hidden = YES;
}
#pragma mark PickerViewDelgate
-(void)didTapBackButton
{
myPickerView.hidden = YES;
myLabelView.hidden = NO;
}
#pragma mark LabelViewDelegate
-(void)didTapTwiceLabelView
{
myPickerView.hidden = NO;
myLabelView.hidden = YES;
}
是的,我的意思是和我在地图上一样的动画。我的问题在这里更多,如果应用程序的架构是正确的使用UIView和UIViewController。我不确定是否应该改为创建三个UIViewControllers。 – dbrasco 2011-02-18 11:55:39
Apple对此有一些建议,通常是正确的:对于一个屏幕的东西,有一个UIViewController。尽管苹果在各个地方实际上违反了他们自己的规则(!),但作为'最终用户'程序员,通常这是个好主意。 – occulus 2011-02-18 12:07:42