2013-01-24 9 views
17

Ho un UISegmentedControl con due segmenti (indice: 0 e 1) che sto cercando di reimpostare a livello di codice su 0. Quando eseguo il comando di seguito, non reimposta l'indice di segmento a 0 come previsto. Invece si evidenzia segmento indicizzato 1.Cambia UISegmentedControl l'indice o il valore selezionato a livello di codice

[seg setSelectedSegmentIndex:0]; 

Stranamente quando accedo segmento selezionato, restituisce 0.

NSLog(@"seg setSelectedSegmentIndex %d", seg.selectedSegmentIndex); 

Inoltre stranamente, dopo l'esecuzione setSelectedSegmentIndex:0 non posso riselezionare segmento 0 manualmente tocco, sembra essere bloccata per segmento 1, fino a quando si tocca 1 in cui funziona come normale.

Ecco la configurazione per il pulsante:

itemArray = [NSMutableArray arrayWithObjects: @"Zero", @"One", nil]; 
    seg = [[UISegmentedControl alloc] initWithItems:itemArray]; 
    [seg setFrame:segRect]; 
    seg.segmentedControlStyle = UISegmentedControlStyleBar; 
    seg.momentary = NO; 
    [seg addTarget:self action:@selector(someAction:) forControlEvents: UIControlEventValueChanged]; 
    [mainView addSubview:seg]; 

NOTA: per ribadire quello che stavo cercando di realizzare con questa domanda: Voglio impostare indice selezionato di un UISegmentedControl tramite una variabile in modo dinamico, otteniate feedback visivo appropriato, e controllare l'indice selezionato in un metodo, per far accadere qualcosa a seconda dell'indice selezionato. Vedi la mia risposta qui sotto per una soluzione.

+0

sono entrambi i segmenti abilitati prima di provare a selezionare? (usando isEnabledForSegmentAtIndex) –

+0

@calvinBhai Penso di sì, il default non dovrebbe essere abilitato? – Mrwolfy

+0

Ho lo stesso problema, il segmento 0 non può essere riselezionato una volta che uno degli altri è stato. Sto andando a rilasciare con una soluzione alternativa di avere un vuoto seg 0 per ora. Il mio segmento si trova all'interno di un UIControl all'interno di un UIScrollView. Ho avuto il problema in precedenza quando iOS 5 ha funzionato bene, ma lo stesso binario su iOS6 ha mostrato questo problema. –

risposta

27

Variazione viewDidLoad:

[seg setSelectedSegmentIndex:index]; 

si cambia utilizzare il valore dell'indice come vostro desiderio.

+0

Sì. Questo è quello che sto facendo. Grazie. – Mrwolfy

1

Da codice, è sufficiente eseguire seg.selectedSegmentIndex = someDefaultIndex.

Se è necessario impostarlo su viewDidLoad: o meno dipende interamente dalla struttura dell'applicazione. Ad esempio, se la tua app è in fase di avvio e carica la vista per la prima volta e deve impostare il controllo su qualunque valore abbia avuto durante la precedente esecuzione dell'app, allora ha sicuramente senso farlo lì.

1

Questo aiuta a ordinare il segmento selezionato, in termini di feedbak visivo, cioè dopo aver impostato in modo programmatico il segmento selezionato, questo tingerà i segmenti correttamente.

for (int i=0; i<[seg.subviews count]; i++) 
{ 

    if ([[seg.subviews objectAtIndex:i] respondsToSelector:@selector(isSelected)] && [[seg.subviews objectAtIndex:i]isSelected]) 
    { 
     [[seg.subviews objectAtIndex:i] setTintColor:[UIColor grayColor]]; 
    } 
    if ([[seg.subviews objectAtIndex:i] respondsToSelector:@selector(isSelected)] && ![[seg.subviews objectAtIndex:i] isSelected]) 
    { 
     [[seg.subviews objectAtIndex:i] setTintColor:[UIColor blackColor]]; 
    } 
} 
0

per ribadire quello che stavo cercando di realizzare con questa domanda: Voglio impostare indice selezionato di un UISegmentedControl tramite una variabile in modo dinamico, ottenere il feedback visivo adeguato e controllare l'indice selezionato in un metodo, di fare qualcosa succede a seconda dell'indice selezionato.

Inizialmente ho intuito che questo è semplice come: mySegmentedController.selectedSegmentIndex = someIndex, quindi test per l'indice. Ma come affermato nella mia domanda, non funzionava per me. Il comportamento è strano Dopo aver eseguito quel codice, il pulsante appropriato non verrà evidenziato.

Ecco un progetto in cui l'ho risolto, quindi funziona. Non sono sicuro del perché funzioni. Forse un ritardo che ho inserito lì, prima di impostare l'indice. Aggiornerò e commenterò il file di progetto se posso perfezionarlo.

http://owolf.net/uploads/StackOverflow/SegmentedControllers.zip

0

ATTENZIONE: Questo non è abbastanza rispondendo alla domanda, ma è strettamente legato.

Ho avuto un problema simile. Il più delle volte il mio UISegmentedController ha funzionato bene. Ha 4 segmenti, Off, 30, 60 e 120.

A intervalli casuali (normalmente appena prima di un rilascio !!), il segmento Off diventa non selezionabile dall'interfaccia utente. (Non ho provato a selezionarlo dal codice perché non è quello che devo fare e non risolverà il mio problema.)

La soluzione è eliminare quel UISegmentedController dal mio XIB e sostituirlo con un nuovo (e esattamente identico) uno che poi funziona bene.

Persino CMD-C e CMD-V avevo spostato il controllore UISegmented in un altro XIB dell'app. E il segmento Off (cioè quello all'indice 0) non era selezionabile anche in quel XIB.

Questo sembra essere un problema con XCode.

0

Swift 3,0

segmentedControl.selectedSegmentIndex = #your value# 
Problemi correlati