2010-06-03 27 views
0

我有一個有4個數組的類:tab_1,tab_2,tab_3和tab_T。 我將選取器的委託和數據源設置爲self(它是包含數組的類)。一個選擇器,數據源的多個數組 - 工作正常但如何?

當textfields開始編輯時,選擇器被調用。爲了防止鍵盤被顯示,我返回NO。我有一個動畫選取器的方法。

根據哪個文本框被觸摸我做: tab_T = tab_1;或2或3

在我看來,這個賦值使tab_T成爲選取器的數據源。這個賦值是否真的將數組tab_T綁定到數據源? 有沒有辦法手動分配它?我確定有。但是picker.datasource = tab_1不起作用。我得到了一個「警告:類'NSMutableArray'沒有實現'UIPickerViewDataSource'協議」。

它的我的第一個應用程序,也許我忘記了我在我的應用程序的早年做了一步。

期待任何願意幫助的人。

Wallou

回答

2

一個UIPickerView的數據源必須是一個實現UIPickerViewDataSource協議的類。選擇器視圖的填充是在這兩種方法實現:

– numberOfComponentsInPickerView: 
– pickerView:numberOfRowsInComponent: 

由於使用的NSArray沒有實現協議:

pickerView.datasource=someArray; 

...生成你已經看到了錯誤說數組不執行協議。

你需要做的第一件事就是聲明你的控制器實現的協議,像這樣:

@interface MyControllerClass: UIViewController <UIPickerViewDataSource,UIPickerViewDelegate> 

,那麼你需要實現協議的方法,這將是這個樣子:

- (NSInteger)numberOfComponentsInPickerView:(UIPickerView *)pickerView{ 
    return 1; //or whatever 
} 

- (NSInteger)pickerView:(UIPickerView *)pickerView numberOfRowsInComponent:(NSInteger)component{ 
    return [self.tab_T count]; // assuming just one component 
} 

要實際填充組件,您需要UIPickerViewDelegate方法。 (我知道這似乎該數據源應該提供,你知道,數據,但由於某種原因,他們有它向後。)

- (NSString *)pickerView:(UIPickerView *)pickerView titleForRow:(NSInteger)row forComponent:(NSInteger)component{ 
    return [self.tab_T objectAtIndex:row]; //assuming one component 
} 

這裏的關鍵思想是,實現了數據源和委託方法的對象作爲拾取器和任何數據結構實際上都包含數據之間的接口。在這種情況下,它只是簡單的數組,但它可以是任何東西,包括核心數據,SQL或從URL下載。

pickerview根本不會直接處理數據結構。它始終是實現進行交互的數據源和委託方法的對象。

+0

morning TechZen, 好的, 感謝您的回答,清晰完整。 我現在明白更好的選擇器的行爲。沃爾沃再見, – wallou 2010-06-04 07:49:35