Nib文件是什么?
一系列对象,被序列化到了某个文件,包括控制器,视图,控件,输出口,action。
如何将controller与nib文件关联?
initWithNibName方法
此时nib文件的file's owner类型必须指定为controller类型,且controller的view输出口必须关联到nib的view
创建controller时候,自动创建xib文件,内部做了什么?
其实就两件事情,指定nib文件的file's owner类型必须指定为controller类型;
controller的view输出口关联到了nib的view
apple自带的几个控制器类
UIViewController
无视图,只有个view输出口。
属性分别为:
title:名称
Nib name:nib文件名称
布局:
是否全屏,将会隐藏TabBar
是否隐藏底部Bar,
是否resize view
UITabBarController
底部有个UITabBar视图
然后两个UIViewController,各包含一个UITabBarItem
(视图可拥有子视图,而UIViewController有一个tabBarItem属性,指向了一个UITabBarItem)
UITabBarItem
Badge:右上角小图标,类似于收到几封邮件的数字
Identifier:预定义的一些类型
Title:名称
Image:图像
增加新标签
设置标签中Controller的具体类型,设置其关联的xib文件(相当于initWithNibName)
修改与Controller关联的UITabBarItem的Title,Image
1.建立标签栏应用程序框架
1)Empty Application模板
2)新建空的tabBarController.xib, 从对象库中拖入一个现成的Tab Bar Controller
此xib文件被加载入内存后,如何获取到现成的UITabBarController对象了?
有两种方法:
1)传统的,输出口
a.定义某类为此xib文件的files owner(此工程就使用appDelegate类就可以),
那么此时需要修改xib文件的files owner的类型
b.在appDelegate中,定义outlet指向此xib文件中的tabBarController
那么当使用方法loadNibNamed将此xib文件加载进内存的时候,前面定义的输出口已经指向文件中的tabBarController了
2)直接使用loadNibNamed方法返回的NSArray
NSArray* arrays = [[NSBundle mainBundle] loadNibNamed:@"TabBarController" owner:self options:nil];
for (id obj in arrays)
{
if ([obj isMemberOfClass:[UITabBarController class]] == YES) {
self.window.rootViewController = obj;
break;
}
}
(一般的:viewController是xib文件的files Owner,xib文件中有一个uiview,
viewController的view输出口指向此view,使用initWithNib方法,通过xib文件初始化viewController。
但是对于这种封装好的,顶层对象是一个controller的tabBarViewController.xib,就直接使用loadNibNamed,
就能获取到序列化到xib文件中的controller对象了。)
注意loadNibNamed与initWithNib的区别
2.修改TabBarController.xib文件
将对应的TabBar上各ViewController的类型和xib文件名修改正确。
3.添加图标
修改BarTabItem的Image属性
4.选取器
默认情况下,选取器显示文本列表,但是他们也能显示图像
5.委托和数据源
Controller为picker的委托和数据源
6.
新建 BIDDatePickerViewController 继承自 UIViewController, 自动创建对应的xib文件
新建 BIDDoubleComponentViewController
新建 BIDDependentComponentViewController
新建 BIDCustomViewViewController
实现日期选取器UIDatePicker
拖控件到controller,关联输出口
设置时间:
NSDate *now = [NSDate date];
[self.datePicker setDate: now];
获取时间:
NSDate *select = [self.datePicker date];
7.实现单组件选取器UIPickerView
拖控件到controller,关联输出口,设置委托和数据源
controller实现Picker的数据源和委托
#pragma mark -
#pragma mark Picker Data Source Methods
-(NSInteger) numberOfComponentsInPickerView:(UIPickerView *)pickerView
{
return 1;
}
-(NSInteger) pickerView:(UIPickerView *)pickerView
numberOfRowsInComponent:(NSInteger)component
{
return [self.pickerContents count];
}
#pragma mark -
#pragma mark Picker Delegate Methods
-(NSString*) pickerView:(UIPickerView *)pickerView
titleForRow:(NSInteger)row
forComponent:(NSInteger)component
{
return [self.pickerContents objectAtIndex:row];
}
获取picker当前选中
8.实现多组件选取器
同上,只是修改数据源和委托方法,支持多个组件
9.实现依赖组件
从属性列表读取数据
通过数据源和委托,构建两个组件的选取器
通过委托方法,当用户选项了左边某项后,更新右边滚轮数据。
@property (strong, nonatomic) NSDictionary *dataDic; //all data
@property (strong, nonatomic) NSArray *states; //cur states
@property (strong, nonatomic) NSArray *codes; //cur codes
-(void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component
{
if (component == kStateIndex) {
self.codes = [self.dataDic valueForKey:self.states[row]];
//重新加载
[self.dependentPicker reloadComponent:kCodeIndex];
[self.dependentPicker selectRow:0 inComponent:kCodeIndex animated:YES];
}
}
10. Create a game use UIPickerView 支持图片的选取器
You need to uncheck the checkbox labeled User Interaction Enabled within
the Viewsettings so that the user can’t manually change the dial and cheat.
打印设备支持的所有字体
for (NSString *family in [UIFont familyNames]) {
NSLog(@"%@", family);
for (NSString *font in [UIFont fontNamesForFamilyName:family]) {
NSLog(@"\t%@", font);
}
}
UIImage *image = [UIImage imageNamed:@"seven"];
- (UIView *)pickerView:(UIPickerView *)pickerView
viewForRow:(NSInteger)row
forComponent:(NSInteger)component reusingView:(UIView *)view
{
UIImage *image = self.images[row];
UIImageView *imageView = [[UIImageView alloc] initWithImage:image];
return imageView;
}
实现不同的委托可以让选取器支持不同类型,字符串或者图片
-
-
-
srandom(time(NULL)); //随机数种子
id d = random(); // 随机数,这样生成的随机数,每次都会不一样
time(NULL)的含义是
生成当前时间。time()函数记录的是具体时间,只有把time()里加上NULL后才能取得当
前时间。
播放音乐
SystemSoundID winSoundID;
-(void)playWinSound
{
if (winSoundID == 0) {
NSURL *soundURL = [[NSBundle mainBundle] URLForResource:@"win"
withExtension:@"wav"];
AudioServicesCreateSystemSoundID((__bridge CFURLRef)soundURL,
&winSoundID);
}
AudioServicesPlaySystemSound(winSoundID);
self.winLabel.text = @"WINNING!";
[self performSelector:@selector(showButton)
withObject:nil
afterDelay:1.5];
}
需要加入Audio Toolbox Framework
总结:
UITabBarController,一个已经封装好的controller,在IB中,可以直接从对象库拖入xib文件
通过loadNibNamed方法,可将其加载入内存
作为应用程序委托的根视图控制器,来管理barItems