UIPickerView 标签栏与选取器(1)

来源:互联网 发布:php中文网视频下载 编辑:程序博客网 时间:2024/06/08 10:54

本章的内容比较多,中间也遇到不少的麻烦,最后还是摸索出来了,学到了一些东西,但是还有一些东西不知道是为什么,自己学习还是有点难呀,下面我就大致把这一章的东西给概括一下,方便我以后查阅了!

这次用到的模板还是Window-based Application,和上次用的一样。这次我们不用自己创建跟控制器,这次我们来使用apple提供的一个类来管理标签视图,我们用UITabBarController实例来处理跟控制器,下面我会详细讲解。

 

首先要创建5个类文件,在Classes文件夹上面点右键,然后Add-New File-Cocoa Touch Classes-UIViewController subclass。用同样的方法创建5个nib文件,这次是在Resources文件夹上点击右键了,名字可以自己定,我命的名字是类名:datePicker,singlePicker,doublePicker,dependentPicker,gamePicker。

nib名字:

dateVeiw,singleVeiw,doubleView,dependentVeiw,gameView.

忘了我创建的此项目的名称是IP_07Pick。

文件创建好了。

 

打开MainWindow.xib向里面拖入一个UITabBarController类,然后Apple+1,添加多个项目,TabBarController默认是2个Items,需要再添加3个。根据自己的需要吧Item1到Item5改成自己想要的名字。下面进行关联。(这个是比较麻烦的事情,我刚开始在这里就弄错了,怎么都出不来结果)

在TabBarController下面的5个项目上双击,要快,这是你会看到inspector里面有几个框,还有一个是image,选中你自己弄好的图片,title也可以在这里修改,然后关联类,不要动,还在这里,Apple+4,在Class里面选择对应的类,这里一个视图对应一个类。我刚开始就是没有选择这个对应关系,结果出错了。一共是5个,慢慢弄,一定要细心。

 

下面开始再关联一下刚才创建的5个视图,打开每一个视图,关联相应的类,再按住File’s Owner拖到View上,实现关联。这也需要5次,每一个视图都要经过这样的步骤。关联也不能出错。

下面就是添加代码了。

打开IP_07PickAppDelegate.h,添加输出口:


@interface IP_07PickAppDelegate : NSObject <UIApplicationDelegate> {
 IBOutlet UIWindow *window;
 IBOutlet UITabBarController *bar;
}

@property (nonatomic, retain) IBOutlet UIWindow *window;
@property (nonatomic, retain) UITabBarController *bar;
@end

然后打开IP_07PickAppDelegate.m修改代码为

@synthesize window;
@synthesize bar;

- (void)applicationDidFinishLaunching:(UIApplication *)application {   
 [window addSubview:bar.view];//添加tabbar
    // Override point for customization after application launch
    [window makeKeyAndVisible];
}


- (void)dealloc {
 [bar release];
    [window release];
    [super dealloc];
}

然后build and go运行一下,5个视图应该可以切换了。如果不可以切换,就要看看各个视图和tabbar关联的是否正确了,这里关联的东西比较多,容易出错。

 

下面实现第一个View,日期控件的使用!

打开第一个xib文件,我的是dateView,然后向里面拖入一个UIDataPicker,把它放在最上面,它的宽度正好和IPhone界面一样大,然后放入一个button,调整该view的大小设置搞为411。

在datePicker.h里面定义变量和方法:

@interface datePicker : UIViewController {
 IBOutlet UIDatePicker *picker;
}
@property (nonatomic, retain) UIDatePicker *picker;
-(IBAction)click;
@end
然后保存,保存后,关联相关变量。把UIDatePicker picker和click方法关联好。(如何关联在我前面的几章里面有详细的介绍)。关联好进入代码的编写。

打开datePicker.m修改成下面的代码:代码后面有解释

#import "datePicker.h"


@implementation datePicker
@synthesize picker;
-(IBAction)click
{
 NSDate *date = [picker date];//得到date picker显示的时间
 NSString *stringDate = [[NSString alloc]initWithFormat:@"Picker显示的时间为%@",date];//格式化字符串
 UIAlertView *alert=[[UIAlertView alloc]initWithTitle:@"Date" message:stringDate delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];//给出提示
 [alert show];
 [alert release];
 [stringDate release];
}

- (void)viewDidLoad {
 NSDate *now = [NSDate date];//得到当前的系统时间
 [picker setDate:now animated:YES];//把当前的时间赋值给date picker
}


……
- (void)dealloc

{
    [picker release];
    [super dealloc];
}


@end

执行一下看看结果吧!

 

 

下面进入第二个View,singleView.这个是单个组建选取器。

打开singleView.xib文件,向里面拖入一个UIPickerView和一个Button控件。调整view的大小为411.和上面一样。然后定义变量:打开singlePicker.h文件,修改为下面

@interface singlePicker : UIViewController
<UIPickerViewDelegate, UIPickerViewDataSource>
{
 IBOutlet UIPickerView *picker;
 NSArray *pickerData;//给picker提供数据的数组
}
@property (nonatomic, retain) UIPickerView *picker;
@property (nonatomic, retain) NSArray *pickerData;
-(IBAction)click;
@end

保存后进行关联。

在picker上面点右键,会弹出一个黑色框,上面显示有dataSource和delegate,选中拖入File‘s Owner上面,这样就让控制器充当选取器的数据源和委托。

下面编写代码了。

打开singlePicker.m文件,修改成下面


@implementation singlePicker

@synthesize picker;
@synthesize pickerData;
-(IBAction)click
{
 NSInteger row = [picker selectedRowInComponent:0];//得到picker当前的行号
 NSString *select = [pickerData objectAtIndex:row];//得到picker当前行显示的内容
 NSString *message = [[NSString alloc]initWithFormat:@"你选中的是%@!",select];//格式化字符串
 UIAlertView *alert = [[UIAlertView alloc]initWithTitle:@"Picker" message:message delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
 [alert show];
 [select release];
 [message release];
 [alert release];
}

-(void)viewDidLoad
{
 NSArray *array=[[NSArray alloc] initWithObjects:@"1",@"2",@"3",@"4",@"5",@"6",@"7",@"8",@"9",@"0",nil];//初始化一个数组,给picker提供数据
 self.pickerData = array;
 [array release];
}

……
- (void)dealloc {
 [picker release];
 [pickerData release];
    [super dealloc];
}

#pragma mark -
#pragma mark picker Data Source Methods
-(NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView
{
 return 1;//返回选取器包含的滚轮数
}

-(NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component
{
 return [pickerData count];//返回选取器数据的行数
}

#pragma mark picker Delegate Methods
-(NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component
{
 return [pickerData objectAtIndex:row];//实现委托返回当前行的数据
}

@end

最下面的3个新方法是选取器所需的,为什么要这样,我也不清楚,先记住呗,就这样了。

运行看结果: