第07章 UITabBarController & UIPickerView

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当前选中

- (NSInteger)selectedRowInComponent:(NSInteger)component

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;

}

实现不同的委托可以让选取器支持不同类型,字符串或者图片

  • pickerView:titleForRow:forComponent:
  • pickerView:attributedTitleForRow:forComponent:
  • pickerView:viewForRow:forComponent:reusingView:

    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

时间: 2024-11-03 05:29:52

第07章 UITabBarController & UIPickerView的相关文章

第07章-体绘制(1)

[译者:这个系列教程是以Kitware公司出版的<VTK User's Guide -11th edition>一书作的中文翻译(出版时间2010年,ISBN: 978-1-930934-23-8),由于时间关系,我们不能保证每周都能更新本书内容,但尽量做到一周更新一篇到两篇内容.敬请期待^_^.欢迎转载,另请转载时注明本文出处,谢谢合作!同时,由于译者水平有限,出错之处在所难免,欢迎指出订正!] [本节对应原书中的第139页至第142页] 第7章体绘制 体绘制是一种三维空间中而非三维空间中的

&lt;&lt;Python基础教程&gt;&gt;学习笔记 | 第07章 | 更加抽象

------ Python:面向对象的编程语言,多态,封装,继承三个主要特性 多态:来自希腊语,意味着有多种形式. >>> from random import choice >>> x = choice(['Hello,World!',[1,2,'e','e',4]]) >>> x.count('e') 1 任何不知道对象到底是什么类型,但又要对对象做的什么的时候,就要用到多态 >>> 1+2 3 >>> 'hot

公开课视频-《第07章 部署-VMware-应用程序虚拟化-ThinApp 5.1.1》

****************** 公开课已讲课程: ****************** 2016-06-22-第04章 部署-Microsoft-服务器虚拟化-Hyper-V 2012 R22016-06-29-第05章 部署-VMware-服务器虚拟化-esxi 6.0.0 U12016-07-06-第06章 部署-VMware-桌面虚拟化-Horizon View 6.2.12016-07-13-第07章 部署-VMware-应用程序虚拟化-ThinApp 5.1.1 ********

第07章 类

JDK即Java开发工具包(Java Development Kit,JDK)泛型(Generic)for-each循环自动装包/拆包(Autoboxing/unboxing)枚举(Enums)可变参数(Varargs)静态导入(Static Imports)模块化(Modularization)多语言支持(Multi-Language Support)开发者生产力(Developer Productivity)性能(Performance)通过查看API文档,知道"Math"类中的所

Java Script 第07章 JavaScript库

第07章—配置文件

spring boot 系列学习记录:http://www.cnblogs.com/jinxiaohang/p/8111057.html 码云源码地址:https://gitee.com/jinxiaohang/springboot 文章参考:https://www.jianshu.com/p/60b34464ca58 properties转yaml工具:https://www.bejson.com/devtools/properties2yaml/ 学习目录 一.基本介绍 二.快速添加属性 三

第07章下 中断和8253

计算机中的时钟分为两类: 内部时钟:是有处理器固件结构决定的,在出厂就设定好了, 无法改变,处理器内部元件工作速度最快,所以内部时钟的时间单位粒度比较细,以纳秒为单位. 外部时钟:是处理器中的内部原件,如运算器,控制器的工作时序,主要用于控制.同步内部工作的不掉,内部时钟有晶体振荡器产生.简称晶振.位于主板上,其频率经过分频之后就是主板的外频.处理器和南北桥之间的通信基于外频.Intel处理器将外频乘某个倍数之后称为主频.处理器取指令执行指令所消耗的时钟周期都是基于主频的. 外部时钟指的是处理器

异步编程系列第04章 编写Async方法

p { display: block; margin: 3px 0 0 0; } --> 写在前面 在学异步,有位园友推荐了<async in C#5.0>,没找到中文版,恰巧也想提高下英文,用我拙劣的英文翻译一些重要的部分,纯属娱乐,简单分享,保持学习,谨记谦虚. 如果你觉得这件事儿没意义翻译的又差,尽情的踩吧.如果你觉得值得鼓励,感谢留下你的赞,愿爱技术的园友们在今后每一次应该猛烈突破的时候,不选择知难而退.在每一次应该独立思考的时候,不选择随波逐流,应该全力以赴的时候,不选择尽力而

异步编程系列第03章 自己写异步代码

p { display: block; margin: 3px 0 0 0; } --> 写在前面 在学异步,有位园友推荐了<async in C#5.0>,没找到中文版,恰巧也想提高下英文,用我拙劣的英文翻译一些重要的部分,纯属娱乐,简单分享,保持学习,谨记谦虚. 如果你觉得这件事儿没意义翻译的又差,尽情的踩吧.如果你觉得值得鼓励,感谢留下你的赞,愿爱技术的园友们在今后每一次应该猛烈突破的时候,不选择知难而退.在每一次应该独立思考的时候,不选择随波逐流,应该全力以赴的时候,不选择尽力而