Perché il metodo delegato UIPickerView widthForComponent non viene chiamato ogni volta che viene visualizzata la vista?

StackOverflow https://stackoverflow.com/questions/1622839

  •  06-07-2019
  •  | 
  •  

Domanda

Ho due controlli sullo schermo di un iPhone: un TableView e un UIPickerView. Quando selezioni la singola cella in TableView, verrai indirizzato a un'altra schermata in cui viene mostrato un elenco di tipi di abbigliamento. La selezione di un singolo capo di abbigliamento dall'elenco riporta alla prima schermata. In base alla selezione effettuata, il numero di componenti in UIPickerView viene modificato (1-4) e ogni componente viene popolato con dati pertinenti.

Supponiamo che tu abbia tre articoli nell'elenco dei tipi di abbigliamento e che ogni articolo debba avere un certo numero di componenti in UIPickerView quando è selezionato:

Cintura - 3 componenti con larghezze di 100, 55, 100 Reggiseno - 3 componenti con larghezze di 55, 55, 55 Altro - 4 componenti con larghezze di 100, 100, 55, 50

Scenario n. 1 - Tutto è come dovrebbe essere

1.1 - Seleziona la "Cintura " articolo di abbigliamento e UIPickerView sono disegnati con 3 componenti con i dati Belt appropriati in ciascun componente. Le larghezze dei componenti sono 100, 55, 100.

1.2 - Seleziona " Altro " abbigliamento e UIPickerView è disegnato con 4 componenti con gli altri dati appropriati in ciascun componente. Le larghezze dei componenti sono 100, 100, 55, 50.

1.3 - Seleziona il " Brassiere " articolo di abbigliamento e UIPickerView è disegnato con 3 componenti con i dati di reggiseno appropriati in ciascun componente. Le larghezze dei componenti sono 55, 55, 55.

Scenario n. 2 - Larghezza dei componenti non ridisegnata

1.1 - Seleziona la "Cintura " articolo di abbigliamento e UIPickerView sono disegnati con 3 componenti con i dati Belt appropriati in ciascun componente. Le larghezze dei componenti sono 100, 55, 100.

1.2 - Seleziona il " Brassiere " articolo di abbigliamento e UIPickerView è disegnato con 3 componenti con i dati di reggiseno appropriati in ciascun componente. Tuttavia, le larghezze dei componenti sono ancora 100, 55, 100, non 55, 55, 55.

1.3 - Seleziona " Altro " abbigliamento e UIPickerView è disegnato con 4 componenti con gli altri dati appropriati in ciascun componente. Le larghezze dei componenti sono 100, 100, 55, 50.

1.2 - Seleziona il " Brassiere " articolo di abbigliamento e UIPickerView è disegnato con 3 componenti con i dati di reggiseno appropriati in ciascun componente. Le larghezze dei componenti ora sono corrette: 55, 55, 55.

Dall'analisi del codice sembra che il metodo delegato UIPickerView widthForComponent venga chiamato solo quando il numero di componenti in UIPickerView cambia.

C'è un modo per forzare questo metodo delegato a sparare ogni volta?

Aggiornamento - 10.26.09

Sto chiamando [UIPickerView reloadAllComponents nel delegato viewWillAppear utilizzando il seguente codice:

-(void)viewWillAppear:(BOOL)animated {

 ...

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

 ...

}

Grazie in anticipo.

È stato utile?

Soluzione

Si scopre che se si reimposta il delegato del selettore, le larghezze dei componenti vengono ridisegnate ogni volta che viene effettuata una selezione. Il codice modificato è simile al seguente:

-(void)viewWillAppear:(BOOL)animated {

 ....

 self.PopulatePickerArray; // Populate components based on selection

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

 [picker reloadAllComponents];

}

Informazioni trovate in questa pagina Web - Modifica-larghezza-UIPicker-continuamente

Altri suggerimenti

In realtà, anche solo usando setNeedsLayout funzionerà e potrebbe essere un po 'più pulito.

[picker reloadAllComponents];
[picker setNeedsLayout];

Non ne sono sicuro, ma puoi provare a chiamare [pickerView reloadAllComponents]; nel tuo metodo viewWillAppear.

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

Il metodo numberOdComponents restituisce currentNumberOfComponents

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top