Enviar pesquisa
Carregar
I os 04
•
0 gostou
•
742 visualizações
信嘉 陳
Seguir
Denunciar
Compartilhar
Denunciar
Compartilhar
1 de 67
Recomendados
«Objective-C Runtime в примерах» — Алексей Сторожев, e-Legion
«Objective-C Runtime в примерах» — Алексей Сторожев, e-Legion
e-Legion
V8
V8
changehee lee
Formacion en movilidad: Conceptos de desarrollo en iOS (IV)
Formacion en movilidad: Conceptos de desarrollo en iOS (IV)
Mobivery
Backbone.js Simple Tutorial
Backbone.js Simple Tutorial
추근 문
ARCでめちゃモテiOSプログラマー
ARCでめちゃモテiOSプログラマー
Satoshi Asano
12advanced Swing
12advanced Swing
Adil Jafri
The Rule of 10,000 Spark Jobs: Learning From Exceptions and Serializing Your ...
The Rule of 10,000 Spark Jobs: Learning From Exceptions and Serializing Your ...
Databricks
The Rule of 10,000 Spark Jobs - Learning from Exceptions and Serializing Your...
The Rule of 10,000 Spark Jobs - Learning from Exceptions and Serializing Your...
Matthew Tovbin
Recomendados
«Objective-C Runtime в примерах» — Алексей Сторожев, e-Legion
«Objective-C Runtime в примерах» — Алексей Сторожев, e-Legion
e-Legion
V8
V8
changehee lee
Formacion en movilidad: Conceptos de desarrollo en iOS (IV)
Formacion en movilidad: Conceptos de desarrollo en iOS (IV)
Mobivery
Backbone.js Simple Tutorial
Backbone.js Simple Tutorial
추근 문
ARCでめちゃモテiOSプログラマー
ARCでめちゃモテiOSプログラマー
Satoshi Asano
12advanced Swing
12advanced Swing
Adil Jafri
The Rule of 10,000 Spark Jobs: Learning From Exceptions and Serializing Your ...
The Rule of 10,000 Spark Jobs: Learning From Exceptions and Serializing Your ...
Databricks
The Rule of 10,000 Spark Jobs - Learning from Exceptions and Serializing Your...
The Rule of 10,000 Spark Jobs - Learning from Exceptions and Serializing Your...
Matthew Tovbin
iOSDevCamp 2011 Core Data
iOSDevCamp 2011 Core Data
Chris Mar
droidQuery: The Android port of jQuery
droidQuery: The Android port of jQuery
PhDBrown
Js 单元测试框架介绍
Js 单元测试框架介绍
louieuser
Arc of developer part1
Arc of developer part1
Junpei Wada
Functional Core, Reactive Shell
Functional Core, Reactive Shell
Giovanni Lodi
The next step, part 2
The next step, part 2
Pat Cavit
fme Alfresco Day 06-2013 - alfresco.js and share
fme Alfresco Day 06-2013 - alfresco.js and share
Alfresco by fme AG
20120121
20120121
komarineko
Beginning icloud development - Cesare Rocchi - WhyMCA
Beginning icloud development - Cesare Rocchi - WhyMCA
Whymca
iOS Beginners Lesson 4
iOS Beginners Lesson 4
Calvin Cheng
MBL301 Data Persistence to Amazon Dynamodb for Mobile Apps - AWS re: Invent 2012
MBL301 Data Persistence to Amazon Dynamodb for Mobile Apps - AWS re: Invent 2012
Amazon Web Services
Js objects
Js objects
anubavam-techkt
Taking a Test Drive
Taking a Test Drive
Graham Lee
Node js mongodriver
Node js mongodriver
christkv
The Ring programming language version 1.10 book - Part 104 of 212
The Ring programming language version 1.10 book - Part 104 of 212
Mahmoud Samir Fayed
Iniciando com jquery
Iniciando com jquery
Danilo Sousa
Create a Core Data Observer in 10mins
Create a Core Data Observer in 10mins
zmcartor
Building data flows with Celery and SQLAlchemy
Building data flows with Celery and SQLAlchemy
Roger Barnes
Core Data with multiple managed object contexts
Core Data with multiple managed object contexts
Matthew Morey
Persisting Data on SQLite using Room
Persisting Data on SQLite using Room
Nelson Glauber Leal
I os 07
I os 07
信嘉 陳
I os 02
I os 02
信嘉 陳
Mais conteúdo relacionado
Mais procurados
iOSDevCamp 2011 Core Data
iOSDevCamp 2011 Core Data
Chris Mar
droidQuery: The Android port of jQuery
droidQuery: The Android port of jQuery
PhDBrown
Js 单元测试框架介绍
Js 单元测试框架介绍
louieuser
Arc of developer part1
Arc of developer part1
Junpei Wada
Functional Core, Reactive Shell
Functional Core, Reactive Shell
Giovanni Lodi
The next step, part 2
The next step, part 2
Pat Cavit
fme Alfresco Day 06-2013 - alfresco.js and share
fme Alfresco Day 06-2013 - alfresco.js and share
Alfresco by fme AG
20120121
20120121
komarineko
Beginning icloud development - Cesare Rocchi - WhyMCA
Beginning icloud development - Cesare Rocchi - WhyMCA
Whymca
iOS Beginners Lesson 4
iOS Beginners Lesson 4
Calvin Cheng
MBL301 Data Persistence to Amazon Dynamodb for Mobile Apps - AWS re: Invent 2012
MBL301 Data Persistence to Amazon Dynamodb for Mobile Apps - AWS re: Invent 2012
Amazon Web Services
Js objects
Js objects
anubavam-techkt
Taking a Test Drive
Taking a Test Drive
Graham Lee
Node js mongodriver
Node js mongodriver
christkv
The Ring programming language version 1.10 book - Part 104 of 212
The Ring programming language version 1.10 book - Part 104 of 212
Mahmoud Samir Fayed
Iniciando com jquery
Iniciando com jquery
Danilo Sousa
Create a Core Data Observer in 10mins
Create a Core Data Observer in 10mins
zmcartor
Building data flows with Celery and SQLAlchemy
Building data flows with Celery and SQLAlchemy
Roger Barnes
Core Data with multiple managed object contexts
Core Data with multiple managed object contexts
Matthew Morey
Persisting Data on SQLite using Room
Persisting Data on SQLite using Room
Nelson Glauber Leal
Mais procurados
(20)
iOSDevCamp 2011 Core Data
iOSDevCamp 2011 Core Data
droidQuery: The Android port of jQuery
droidQuery: The Android port of jQuery
Js 单元测试框架介绍
Js 单元测试框架介绍
Arc of developer part1
Arc of developer part1
Functional Core, Reactive Shell
Functional Core, Reactive Shell
The next step, part 2
The next step, part 2
fme Alfresco Day 06-2013 - alfresco.js and share
fme Alfresco Day 06-2013 - alfresco.js and share
20120121
20120121
Beginning icloud development - Cesare Rocchi - WhyMCA
Beginning icloud development - Cesare Rocchi - WhyMCA
iOS Beginners Lesson 4
iOS Beginners Lesson 4
MBL301 Data Persistence to Amazon Dynamodb for Mobile Apps - AWS re: Invent 2012
MBL301 Data Persistence to Amazon Dynamodb for Mobile Apps - AWS re: Invent 2012
Js objects
Js objects
Taking a Test Drive
Taking a Test Drive
Node js mongodriver
Node js mongodriver
The Ring programming language version 1.10 book - Part 104 of 212
The Ring programming language version 1.10 book - Part 104 of 212
Iniciando com jquery
Iniciando com jquery
Create a Core Data Observer in 10mins
Create a Core Data Observer in 10mins
Building data flows with Celery and SQLAlchemy
Building data flows with Celery and SQLAlchemy
Core Data with multiple managed object contexts
Core Data with multiple managed object contexts
Persisting Data on SQLite using Room
Persisting Data on SQLite using Room
Destaque
I os 07
I os 07
信嘉 陳
I os 02
I os 02
信嘉 陳
I os 06
I os 06
信嘉 陳
I os 05
I os 05
信嘉 陳
I os 16
I os 16
信嘉 陳
I os 09
I os 09
信嘉 陳
I os 08
I os 08
信嘉 陳
課程規畫
課程規畫
信嘉 陳
I os 15
I os 15
信嘉 陳
I os 03
I os 03
信嘉 陳
I os 14
I os 14
信嘉 陳
I os 11
I os 11
信嘉 陳
I os 10
I os 10
信嘉 陳
I os 13
I os 13
信嘉 陳
Destaque
(14)
I os 07
I os 07
I os 02
I os 02
I os 06
I os 06
I os 05
I os 05
I os 16
I os 16
I os 09
I os 09
I os 08
I os 08
課程規畫
課程規畫
I os 15
I os 15
I os 03
I os 03
I os 14
I os 14
I os 11
I os 11
I os 10
I os 10
I os 13
I os 13
Semelhante a I os 04
201104 iphone navigation-based apps
201104 iphone navigation-based apps
Javier Gonzalez-Sanchez
Formacion en movilidad: Conceptos de desarrollo en iOS (III)
Formacion en movilidad: Conceptos de desarrollo en iOS (III)
Mobivery
Your Second iPhone App - Code Listings
Your Second iPhone App - Code Listings
Vu Tran Lam
Apple Templates Considered Harmful
Apple Templates Considered Harmful
Brian Gesiak
iOS for ERREST - alternative version
iOS for ERREST - alternative version
WO Community
Conceitos e prática no desenvolvimento iOS - Mobile Conf 2014
Conceitos e prática no desenvolvimento iOS - Mobile Conf 2014
Fábio Pimentel
Using a model view-view model architecture for iOS apps
Using a model view-view model architecture for iOS apps
allanh0526
Writing native bindings to node.js in C++
Writing native bindings to node.js in C++
nsm.nikhil
004
004
Stronger Shen
Heroku pop-behind-the-sense
Heroku pop-behind-the-sense
Ben Lin
10 tips for a reusable architecture
10 tips for a reusable architecture
Jorge Ortiz
303 TANSTAAFL: Using Open Source iPhone UI Code
303 TANSTAAFL: Using Open Source iPhone UI Code
jonmarimba
How to instantiate any view controller for free
How to instantiate any view controller for free
BenotCaron
iOS 101 - Xcode, Objective-C, iOS APIs
iOS 101 - Xcode, Objective-C, iOS APIs
Subhransu Behera
Backbone.js
Backbone.js
Omnia Helmi
Swift Tableview iOS App Development
Swift Tableview iOS App Development
Ketan Raval
Desenvolvimento iOS - Aula 4
Desenvolvimento iOS - Aula 4
Saulo Arruda
Understanding backbonejs
Understanding backbonejs
Nick Lee
Developing iOS REST Applications
Developing iOS REST Applications
lmrei
iOS
iOS
Scott Leberknight
Semelhante a I os 04
(20)
201104 iphone navigation-based apps
201104 iphone navigation-based apps
Formacion en movilidad: Conceptos de desarrollo en iOS (III)
Formacion en movilidad: Conceptos de desarrollo en iOS (III)
Your Second iPhone App - Code Listings
Your Second iPhone App - Code Listings
Apple Templates Considered Harmful
Apple Templates Considered Harmful
iOS for ERREST - alternative version
iOS for ERREST - alternative version
Conceitos e prática no desenvolvimento iOS - Mobile Conf 2014
Conceitos e prática no desenvolvimento iOS - Mobile Conf 2014
Using a model view-view model architecture for iOS apps
Using a model view-view model architecture for iOS apps
Writing native bindings to node.js in C++
Writing native bindings to node.js in C++
004
004
Heroku pop-behind-the-sense
Heroku pop-behind-the-sense
10 tips for a reusable architecture
10 tips for a reusable architecture
303 TANSTAAFL: Using Open Source iPhone UI Code
303 TANSTAAFL: Using Open Source iPhone UI Code
How to instantiate any view controller for free
How to instantiate any view controller for free
iOS 101 - Xcode, Objective-C, iOS APIs
iOS 101 - Xcode, Objective-C, iOS APIs
Backbone.js
Backbone.js
Swift Tableview iOS App Development
Swift Tableview iOS App Development
Desenvolvimento iOS - Aula 4
Desenvolvimento iOS - Aula 4
Understanding backbonejs
Understanding backbonejs
Developing iOS REST Applications
Developing iOS REST Applications
iOS
iOS
Mais de 信嘉 陳
Processing 06
Processing 06
信嘉 陳
Processing 05
Processing 05
信嘉 陳
Processing 04
Processing 04
信嘉 陳
Processing 03
Processing 03
信嘉 陳
Processing 02
Processing 02
信嘉 陳
Processing 01
Processing 01
信嘉 陳
Processing 09
Processing 09
信嘉 陳
Processing 08
Processing 08
信嘉 陳
Processing 07
Processing 07
信嘉 陳
I os 01
I os 01
信嘉 陳
Google 街景
Google 街景
信嘉 陳
社群網站 Facebook
社群網站 Facebook
信嘉 陳
網路搜尋
網路搜尋
信嘉 陳
Mais de 信嘉 陳
(13)
Processing 06
Processing 06
Processing 05
Processing 05
Processing 04
Processing 04
Processing 03
Processing 03
Processing 02
Processing 02
Processing 01
Processing 01
Processing 09
Processing 09
Processing 08
Processing 08
Processing 07
Processing 07
I os 01
I os 01
Google 街景
Google 街景
社群網站 Facebook
社群網站 Facebook
網路搜尋
網路搜尋
I os 04
1.
Class 04 iOS 應⽤用軟體設計
2.
內容⼤大綱 •
Objective-C 陣列 (NSArray, NSMutableArray) • QV008:陣列圖⽚片變換動畫 • UIPickerView 與 Delegate 代理⽅方法 • QV009:以程式⽅方式產⽣生 • QV010:基本,以 xib ⽅方式使⽤用 • QV011:UIPickerView + UIDatePicker • QV012:UIPickerView 多個區段選擇 • 其他 UIPickerView 特殊技巧與範例 • QV105:相依關聯的 Picker • QV106:頭尾相連的 Picker • QV107:吃⾓角⼦子⽼老⻁虎 • Samples:Pickers Demo
3.
陣列類別 NSArray
4.
NSArray (1/2) •
可以把任何物件當做元素置⼊入 • 可依照順序存取 • 可直接存取指定位置元素 • 索引由 0 開始 • 元素裡可以混合相異的類別實體 • 可以多次含有相同的物件 • 不可以把 nil 做為元素
5.
NSArray (2/2) • NSArray
的實體產⽣生後...... • 物件不可變更 • 不可追加新物件 • 不可刪除元素
6.
(1) 陣列物件的初始化及產⽣生 •
-(id) array • -(id) arrayWithObject: (id) anObject • -(id) initWithObjects: (id) firstObj, ...... • -(id) initWithObjects: (id *) objects count: (NSInteger) count • -(id) initWithArray: (NSArray *) anArray • -(id) initWithArray: (NSArray *) array copyItems: (BOOL) flag
7.
(2) 陣列物件的存取 • -(NSUinteger)
count • -(NSUinteger) indexOfObject: (id)anObject • -(id) objectAtIndex: (NSUInteger) index • -(id) lastObject • -(void) getObjects: (id) aBuffer • -(NSArray *) subarrayWithRange: (NSRange) range
8.
(3) ⽐比較 • -(BOOL)
isEqualToArray: (id)anObject • -(id) firstObjectCommonWithArray: (NSArray *) otherArray
9.
(4) 增加新元素 • -(NSArray
*) arrayByAddingObject: (id)anObject • -(NSArray *) arrayByAddingObjectsFromArray: (NSArray *)anArray
10.
(5) 排序 • -(NSArray
*) sortedArrayUsingSelector: (SEL) comparator • -(NSArray *) sortedArrayUsingFunction: (NSInteger (*)(id,id,void*)) comparator context: (void *)context
11.
(6) 對元素的訊息傳送 • -(void)
makeObjectsPerform: (SEL)aSelector • -(void) makeObjectsPerform: (SEL) aSelector withObject: (id) anObj
12.
(7) 字串元素的操作 • -
(NSString *) componentsJoineByString: (NSString *) separator • - (NSArray *) pathsMatchingExtensions: (NSArray *) filterTypes
13.
(8) 檔案的輸出與輸⼊入 • -(NSString
*) description • -(id) initWithContentsOfFile: (NSString *)aPath • -(BOOL) writeToFile: (NSString *) path atomically:(BOOL)flag
14.
陣列類別 NSMutableArray
15.
NSMutableArray • 可變的陣列類別 • NSMutableArray
為 NSArray 的⼦子類別 (可以使⽤用 NSArray 的所有⽅方法) • 可以插⼊入新物件 • 可以前後移動元素物件 • 可以刪除物件 (不會有空格產⽣生)
16.
(1) 陣列物件的初始化 • -(id)
initWithCapacity: (NSUInteger) numItems
17.
(2) 陣列的追加與置換 •
-(void) addObject: (id)anObject • -(void) addObjecsFromArray: (NSArray *)otherArray • -(void) insertObject: (id)anObject atIndex:(NSUInteger) index • -(void) replaceObjectAtIndex: (NSUInteger)index withObject:(id)anObject • -(void) setArray: (NSArray *)otherArray • -(void) exchangeObjectAtIndex: (NSUinteger)idx1 withObjectAtIndex:(NSUInteger) idx2
18.
(3) 物件的刪除 •
-(void) removeAllObjects • -(void) removeLastObject • -(void) removeObjectAtIndex: (NSUInteger)index • -(void) removeObjectsInRange: (NSRange)aRange • -(void) removeObject: (id)anObject • -(void) removeObjectsInArray: (NSArray *)otherArray
19.
(4) 排序 • -(void)
sortUsingSelector: (SEL)comparator • -(void) sortUsingFunction:(NSInteger (*) (idid,void *))compare context:(void *)context
20.
陣列快速列舉 • id obj;
for (obj in group) { ........... }
21.
列舉⼦子 NSEnumerator •
對被存放在陣列、集合、字典等集合中的元素物 件,可以依序存取的系統 • Objective-C 2.0 後多被 for ...in 取代 • ⽅方法...... • -(id) nextObject • -(NSArray *) allObjects • -(NSEnumerator *) objectEnumerator • -(NSEnumerator *) reverseObjectEnumerator
22.
範例: 連續圖⽚片呈現的動畫
23.
Project QV008 UIImageView 的圖⽚片連 續動畫
24.
25.
ViewController.m - (void)viewDidLoad {
[super viewDidLoad]; NSArray *myImages = [NSArray arrayWithObjects: [UIImage imageNamed:@"01.jpg"], [UIImage imageNamed:@"02.jpg"], [UIImage imageNamed:@"03.jpg"], ⽤用陣列定義 [UIImage imageNamed:@"04.jpg"], 多個圖檔 [UIImage imageNamed:@"05.jpg"], [UIImage imageNamed:@"06.jpg"], nil]; UIImageView *myAnimatedView = [[UIImageView alloc] initWithFrame:CGRectMake(90, 100, 140, 140)]; myAnimatedView.animationImages = myImages; myAnimatedView.animationDuration = 3.0; myAnimatedView.animationRepeatCount = 0; [myAnimatedView startAnimating]; 動畫設定 [self.view addSubview:myAnimatedView]; }
26.
UIPickerView
27.
UIPickerView 挑選器 • 提供⼀一份清單給使⽤用者選擇 •
Picker 本⾝身不會保存任何資料 (需要⾃自⾏行建⽴立 NSArray 來保留資料) • 它會呼叫 DataSource 和 Delegate 的⽅方法 以取得要顯⽰示的資料
28.
• UIPickerViewDataSource • UIPickerViewDelegate
29.
範例: QV009:UIPickerView 顯⽰示資料 (code) QV010:UIPickerView
顯⽰示資料 (xib) QV011:⽐比較 UIPickerView 及 UIDatePicker QV012:UIPickerView 多區段處理
30.
Project QV009 以程式⽅方式產⽣生 UIPickerView 陣列指定 Objective-C 的協定
UIPickerViewDelegate UIPickerViewDataSource
31.
ViewController.h #import <UIKit/UIKit.h> @interface ViewController
: UIViewController <UIPickerViewDelegate, UIPickerViewDataSource> { UIPickerView *myPickerView; NSArray *dataArray; 使⽤用兩個協定 } @property (retain, nonatomic) UIPickerView *myPickerView; @property (retain, nonatomic) NSArray *dataArray; @end
32.
#import "ViewController.h"
ViewController.m (1/2) @implementation ViewController @synthesize myPickerView, dataArray; - (void)viewDidLoad { 寬度可調,但⾼高度固定 [super viewDidLoad]; myPickerView = [[UIPickerView alloc] initWithFrame:CGRectMake(0, 0, 320, 240)]; myPickerView.dataSource = self; 物件的代理⼈人 myPickerView.delegate = self; myPickerView.showsSelectionIndicator = YES; 其他屬性 // 決定清單陣列 NSArray *listArray = [[NSArray alloc] initWithObjects: @"AAAAA", @"BBBBB", @"CCCCC", @"DDDDD", @"EEEEE", @"FFFFF", nil]; self.dataArray = listArray; [self.view addSubview:myPickerView]; } 項⺫⽬目清單另外存放 ****** 省略部分程式 ****** @end
33.
ViewController.m (2/2) -(NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView {
return 1; 共有幾個區段 } -(NSInteger)pickerView:(UIPickerView *)pickView numberOfRowsInComponent: (NSInteger)component { return [dataArray count]; 在區段內有幾個項⺫⽬目 } -(void)pickerView:(UIPickerView *)pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component { // 此處尚無處理選取後的動作 } -(NSString *)pickerView:(UIPickerView *)pickerView titleForRow: (NSInteger)row forComponent:(NSInteger)component { return [dataArray objectAtIndex:row]; 各個項⺫⽬目的⽂文字 }
34.
Project QV010 UIPickerView 改為 xib
顯⽰示畫⾯面
35.
ViewController.xib
連結線拉到 File's Owner
36.
ViewController.h #import <UIKit/UIKit.h> @interface ViewController
: UIViewController <UIPickerViewDelegate, UIPickerViewDataSource> { IBOutlet UIPickerView *myPickerView; NSArray *dataArray; } @property(retain, nonatomic) IBOutlet UIPickerView *myPickerView; @property(retain, nonatomic) NSArray *dataArray; @end
37.
ViewController.m #import "ViewController.h" @implementation ViewController @synthesize
myPickerView, dataArray; - (void)viewDidLoad { [super viewDidLoad]; self.dataArray = [[NSArray alloc] initWithObjects: @"AAAAA", @"BBBBBB", @"CCCCC", @"DDDDD", @"EEEEE" , @"FFFFF", nil]; } ****** 省略部分程式 ******
38.
Project QV011 UIPickerView
UIDatePicker 處理選取結果。⽐比較兩種 Picker 的處理⽅方式 (Delegate, Action)
39.
ViewController.h #import <UIKit/UIKit.h> @interface ViewController
: UIViewController <UIPickerViewDelegate, UIPickerViewDataSource> { IBOutlet UILabel *message; IBOutlet UIPickerView *myPickerView; IBOutlet UIDatePicker *myDatePicker; NSArray *dataArray; } @property (retain, nonatomic) IBOutlet UILabel *message; @property (retain, nonatomic) IBOutlet UIPickerView *myPickerView; @property (retain, nonatomic) IBOutlet UIDatePicker *myDatePicker; @property (retain, nonatomic) NSArray *dataArray; -(IBAction)dateSelect:(id)sender; @end
40.
ViewController.m -(NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView {
return 2; } -(NSInteger)pickerView: (UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component { return [dataArray count]; } -(void)pickerView: (UIPickerView *) pickerView didSelectRow: (NSInteger)row inComponent:(NSInteger)component { NSInteger r = [myPickerView selectedRowInComponent:component]; NSString *item = [dataArray objectAtIndex:row]; message.text = [NSString stringWithFormat: @"%d, %d : %@", component, r, item]; } -(NSString *)pickerView: (UIPickerView *)pickerView titleForRow: (NSInteger)row forComponent:(NSInteger)component { return [dataArray objectAtIndex:row]; }
41.
ViewController.xib UIDatePicker 使⽤用Action的⽅方式
42.
ViewController.m -(IBAction)dateSelect:(id)sender {
NSDate *selected = [myDatePicker date]; NSString *str = [[NSString alloc] initWithFormat:@"%@", selected]; message.text = str; }
43.
Project QV012 UIPickerView
多個區段資料的處理
44.
ViewController.h #import <UIKit/UIKit.h> @interface ViewController
: UIViewController <UIPickerViewDelegate, UIPickerViewDataSource> { IBOutlet UILabel *message; IBOutlet UIPickerView *myPickerView; NSArray *dataArray1, *dataArray2; } @property (retain, nonatomic) IBOutlet UILabel *message; @property (retain, nonatomic) IBOutlet UIPickerView *myPickerView; @property (retain, nonatomic) NSArray *dataArray1, *dataArray2; @end
45.
ViewController.m (1/3) #import "ViewController.h" @implementation
ViewController @synthesize message, myPickerView, dataArray1, dataArray2; - (void)viewDidLoad { [super viewDidLoad]; ! myPickerView.dataSource = self; myPickerView.delegate = self; dataArray1 = [[NSArray alloc] initWithObjects:@"AAA", @"BBB", @"CCC", @"DDD", nil]; dataArray2 = [[NSArray alloc] initWithObjects:@"111", @"222", @"333", @"444", @"555", nil]; }
46.
ViewController.m (2/3) - (NSInteger)numberOfComponentsInPickerView:(UIPickerView
*)pickerView {! ! return 2; } - (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent: (NSInteger)component {! if (component==0) { return [dataArray1 count]; } else { return [dataArray2 count]; } } - (NSString *)pickerView:(UIPickerView *)pickerView titleForRow: (NSInteger)row forComponent:(NSInteger)component { if(component==0) { return [dataArray1 objectAtIndex:row]; } else { return [dataArray2 objectAtIndex:row]; } }
47.
ViewController.m (3/3) - (void)pickerView:
(UIPickerView *) pickerView didSelectRow:(NSInteger)row inComponent:(NSInteger)component {! NSInteger n1 = [myPickerView selectedRowInComponent:0]; NSInteger n2 = [myPickerView selectedRowInComponent:1]; NSString *str1 = [dataArray1 objectAtIndex:n1]; NSString *str2 = [dataArray2 objectAtIndex:n2]; NSString *str = [[NSString alloc] initWithFormat:@"%@ -- %@", str1, str2]; message.text = str; }
48.
範例:
區段間有相依關聯 (左邊的改變會重設右邊的項⺫⽬目)
49.
Project QV105 製作有相依關聯的 Picker 利⽤用
NSDictionary 存放資料
50.
#import <UIKit/UIKit.h>
ViewController.h @interface ViewController : UIViewController<UIPickerViewDelegate> { NSMutableDictionary *data; NSArray *keys; ViewController.xib IBOutlet UIPickerView *picker; IBOutlet UILabel *label; } @end
51.
ViewController.m (1/4) - (void)viewDidLoad {
[super viewDidLoad]; [self prepareData]; } - (void) prepareData { data = [[NSMutableDictionary alloc] init]; [data setValue:[NSArray arrayWithObjects: @"可樂",@"沙⼠士",@"果汁",@"其他",nil] forKey:@"飲料"]; [data setValue:[NSArray arrayWithObjects: @"蛋糕",@"糖果",@"巧克⼒力",@"其他",nil] forKey:@"甜點"]; keys =[[data allKeys] sortedArrayUsingComparator: (NSComparator)^(id obj1,id obj2) { return [obj1 caseInsensitiveCompare:obj2]; }]; }
52.
ViewController.m (3/4) //設定滾輪總共有幾個欄位 - (NSInteger)numberOfComponentsInPickerView:(UIPickerView
*)thePickerView { return 2; } //設定滾輪總共有幾個項⺫⽬目 - (NSInteger)pickerView:(UIPickerView *)thePickerView numberOfRowsInComponent:(NSInteger)component { if (component==0) { return [keys count]; } else { NSString *key = [keys objectAtIndex: [thePickerView selectedRowInComponent:0]]; // 飲料或甜點 NSArray *array = [data objectForKey:key]; return [array count]; } }
53.
ViewController.m (3/4) //設定滾輪顯⽰示的⽂文字 - (NSString
*)pickerView:(UIPickerView *)thePickerView titleForRow: (NSInteger)row forComponent:(NSInteger)component { if (component==0) { return[keys objectAtIndex:row]; } else { NSString *key = [keys objectAtIndex: [thePickerView selectedRowInComponent:0]]; // 飲料或甜點 NSArray *array = [data objectForKey:key]; return [array objectAtIndex:row]; } }
54.
ViewController.m (4/4) //設定滾輪顯⽰示的⽂文字 - (NSString
*)pickerView:(UIPickerView *)thePickerView titleForRow: (NSInteger)row forComponent:(NSInteger)component { if (component==0) { return[keys objectAtIndex:row]; } else { NSString *key = [keys objectAtIndex: [thePickerView selectedRowInComponent:0]]; // 飲料或甜點 NSArray *array = [data objectForKey:key]; return [array objectAtIndex:row]; } }
55.
範例: 頭尾連續的選擇器
56.
Project QV106 製作頭尾相接的滾輪選擇器 UIPickerView 採⽤用技巧
假設項⺫⽬目⾮非常多,每次滾 動時計算該顯⽰示的資料 滾動結束時,重新移到中 間相對應的位置
57.
ViewController.m (1/2) const int
MAX_ROLL = 1000; 宣告⼀一個很⼤大的數 - (void)viewDidLoad { 形同有這麼多項 [super viewDidLoad]; list = [NSArray arrayWithObjects:@"AAA", @"BBB", @"CCC", @"DDD", @"EEE", @"FFF", @"GGG", @"HHH", @"III", @"JJJ", @"KKK", @"LLL", nil]; [self pickerViewReLoad]; } - (NSInteger) numberOfComponentsInPickerView:(UIPickerView *)pickerView { return 1; } -(NSInteger) pickerView:(UIPickerView *)pickerView numberOfRowsInComponent: (NSInteger)component { return MAX_ROLL; }
58.
ViewController.m (1/2)
計算相對應的元素位置 -(NSString *)pickerView:(UIPickerView *)pickerView titleForRow: (NSInteger)row forComponent:(NSInteger)component { return [list objectAtIndex:(row%[list count])]; } -(void) pickerView:(UIPickerView *)pickerView didSelectRow: (NSInteger)row inComponent:(NSInteger)component { [self pickerViewReLoad]; 重新移到中間但 } 相對應元素位置 -(void) pickerViewReLoad { NSUInteger max = MAX_ROLL; NSUInteger base = (max/2) - (max/2)%[list count]; [myPickerView selectRow:[myPickerView selectedRowInComponent:0]%[list count]+base inComponent:0 animated:NO]; }
59.
範例: 吃⾓角⼦子⽼老⻁虎
60.
Project QV107 以圖⽚片做為
UIPickerView 的內容 吃⾓角⼦子⽼老⻁虎
61.
ViewController.h #import <UIKit/UIKit.h> @interface ViewController
: UIViewController <UIPickerViewDelegate, UIPickerViewDataSource> { IBOutlet UIPickerView *pickerView; IBOutlet UILabel *statusLabel; NSArray *column1; NSArray *column2; NSArray *column3; UIButton *spinButton; } @property (nonatomic, retain) IBOutlet UIPickerView *pickerView; @property (nonatomic, retain) IBOutlet UILabel *statusLabel; @property (nonatomic, retain) NSArray *column1, *column2, *column3; - (IBAction) spin:(id)sender; @end
62.
ViewController.m (1/3) - (void)viewDidLoad {
[super viewDidLoad]; UIImage *img1 = [UIImage imageNamed:@"32_Twitter.png"]; UIImage *img2 = [UIImage imageNamed:@"32_Elephant.png"]; UIImage *img3 = [UIImage imageNamed:@"32_Babelfish.png"]; UIImage *img4 = [UIImage imageNamed:@"32_Panda.png"]; UIImage *img5 = [UIImage imageNamed:@"32_Penguin.png"]; UIImage *img6 = [UIImage imageNamed:@"32_Duckling.png"]; for (int i=1; i<=3; i++) { UIImageView *imgView1 = [[UIImageView alloc] initWithImage:img1]; UIImageView *imgView2 = [[UIImageView alloc] initWithImage:img2]; UIImageView *imgView3 = [[UIImageView alloc] initWithImage:img3]; UIImageView *imgView4 = [[UIImageView alloc] initWithImage:img4]; UIImageView *imgView5 = [[UIImageView alloc] initWithImage:img5]; UIImageView *imgView6 = [[UIImageView alloc] initWithImage:img6]; NSArray *array = [[NSArray alloc] initWithObjects: imgView1, imgView2, imgView3, imgView4, imgView5, imgView6, nil]; NSString *aryName = [[NSString alloc] initWithFormat:@"column%d", i]; [self setValue:array forKey:aryName]; } } Picker 內的資料為圖
63.
-(IBAction) spin:(id)sender
ViewController.m (2/3) { BOOL win = NO; int numInRow = 1; int lastValue = -1; 重新指定 Picker 內指到的位置 for(int i=0; i<3; i++) { int newValue = arc4random() % [self.column1 count]; numInRow = (newValue==lastValue) ? (numInRow+1) : 1; lastValue = newValue; [pickerView selectRow:newValue inComponent:i animated:YES]; [pickerView reloadComponent:i]; if(numInRow>=2) { win = YES; } "連續" 兩個相同的為贏 } statusLabel.hidden = YES; spinButton.hidden = YES; if(win) { [self performSelector:@selector(playerWin) withObject:nil afterDelay:0.5]; } else { [self performSelector:@selector(showButton) withObject:nil afterDelay:0.5]; } statusLabel.text = @"LOSE...."; }
64.
ViewController.m (3/3) #pragma mark
- UIPickerView Delegate -(NSInteger) numberOfComponentsInPickerView:(UIPickerView *)pickerView { return 3; } -(NSInteger) pickerView:(UIPickerView *)pickerView numberOfRowsInComponent: (NSInteger)component { return [self.column1 count]; } -(UIView *) pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view { NSString *arrayName = [NSString stringWithFormat:@"column%d", component+1]; NSArray *array = [self valueForKey:arrayName]; return [array objectAtIndex:row]; }
65.
範例觀摩: PickersDemo (綜合多種
Picker 的⽰示範)
66.
67.
......