2009-10-26 61 views
1

我在iPhone屏幕上有兩個控件 - 一個TableView和一個UIPickerView。當您在TableView中選擇單個單元格時,您會看到另一個顯示服裝類型列表的屏幕。從列表中選擇一件衣服項目會將您帶回第一個屏幕。根據您的選擇,UIPickerView中組件的數量會發生變化(1-4),並且每個組件都會填充相關數據。爲什麼在每次顯示視圖時都不調用UIPickerView widthForComponent委託方法?

比方說,你有你的服裝類型列表中的三個項目和每個項目都要有一定數量的UIPickerView組件當選擇它:

腰帶 - 3個組件與55的100寬度,100 胸罩 - 3個組分具有55寬度,55,55 其他 - 4個部件55的100的寬度,100,,50

場景#1 - 一切是因爲它應該是

1.1 - 您選擇「腰帶」服裝項目和UIPickerView是用3個組件繪製的每個組件中的適當皮帶數據。零件寬度爲100,55,100。

1.2 - 您選擇「其他」服裝項目,UIPickerView使用4個組件繪製,並在每個組件中使用適當的其他數據繪製。組件的寬度爲100,100,55,50。

1.3 - 您選擇「Brassiere」服裝項目,UIPickerView使用3個組件繪製,並在每個組件中使用相應的Brassiere數據。該組件寬度是55,55,55

方案2 - 不重繪

1.1組件寬度 - 您選擇「帶」的衣服物品和UIPickerView畫有3個組件與相應的帶數據每個組件。零件寬度爲100,55,100。

1.2 - 選擇「Brassiere」服裝項目,UIPickerView用3個組件繪製,並在每個組件中使用適當的Brassiere數據。但是,組件寬度仍爲100,55,100,而不是55,55,55。

1.3 - 您選擇「其他」服裝項目,UIPickerView使用4個組件繪製,每個組件中包含適當的其他數據。零件寬度爲100,100,55,50。

1.2 - 選擇「Brassiere」服裝項目,UIPickerView使用3個組件繪製,並在每個組件中使用相應的Brassiere數據繪製。組件寬度現在正確 - 55,55,55。

從單步執行代碼看起來像UIPickerView widthForComponent委託方法僅在UIPickerView中的組件數發生更改時調用。

有沒有什麼辦法強制這個委託方法每次觸發?

更新 - 09年10月26日

我打電話[UIPickerView reloadAllComponents使用下面的代碼viewWillAppear中代表:

-(void)viewWillAppear:(BOOL)animated { 

... 

self.PopulatePickerArrays; // Populate components based on selection 
[sizePicker reloadAllComponents]; 

... 

} 

在此先感謝。

回答

7

事實證明,如果您重置選擇器的代表,該組件寬度做出選擇時,每次重繪。修改後的代碼看起來是這樣的:

-(void)viewWillAppear:(BOOL)animated { 

.... 

self.PopulatePickerArray; // Populate components based on selection 

sizePicker.delegate = nil; // NEW CODE 
sizePicker.delegate = self; // NEW CODE 

[picker reloadAllComponents]; 

} 

本網頁上找到的信息 - Changing-Width-UIPicker-Continually

0

我不確定,但您可以嘗試在您的viewWillAppear方法中調用[pickerView reloadAllComponents];

if(currentNumbersOfComponents < 4){ 
    currentNumbersOfComponents++; 
    [picker reloadAllComponents]; 
} 

的numberOdComponents方法返回currentNumberOfComponents

+1

我已經這樣做了(請參閱上面的代碼示例)。只有當UIPickerView中的組件數量發生更改時,纔會調用widthForComponent委託方法。 – billmaya 2009-10-26 10:56:52

+0

嗯。我剛試圖按下一個按鈕來實現不斷變化的組件數量,它工作正常... onBtnPlusComponent的代碼是在我的文章。 – Morion 2009-10-26 11:51:34

6

其實,只是用setNeedsLayout也將工作,可能會有點清潔。

[picker reloadAllComponents]; 
[picker setNeedsLayout]; 
+0

這應該是答案,完美的作品,不需要解決方法, – danfordham 2016-10-26 16:29:34

相關問題