2010-07-16 15 views
7

Nel mio codice sto usando un UISegmentedControl come un "pulsante" con solo un segmento e la proprietà momentary impostata su YES. Nelle versioni dell'SDK precedenti a iOS 4, questo non era un problema, ma sembra che ora iOS 4 richieda almeno 2 segmenti. Il seguente codice genera un'eccezione:Utilizzo di UISegmentedControl come pulsante

NSArray *titles = [NSArray arrayWithObject:@"Button Title"]; 
myButton = [[UISegmentedControl alloc] initWithItems:titles]; 

e ora in Interface Builder è possibile nemmeno creare un'UISegmentedControl con meno di 2 segmenti. Registra il seguente errore durante la creazione:

"Il numero di proprietà di segmenti di un controllo segmentato deve essere maggiore o uguale a 2."

Sono un po 'perplesso. Qualche soluzione di lavoro per questo? Ho provato a creare un UISegmentedControl con due pulsanti e quindi a rimuoverne uno a livello di codice e "funziona" in quanto non causa l'arresto anomalo dell'app. Ottengo un pulsante in iOS 3 e nulla in iOS 4. Qualche idea?

+0

Anche questo mi disturba. Lo sto usando come sostituto del pulsante "glass", che Apple non ha ancora inserito nella parte pubblica dell'SDK. –

+0

Sembra che tu abbia dimenticato nil come un secondo elemento nell'array dei titoli. Vedere la mia risposta qui sotto per codice funzionante. – spbfox

+0

arrayWithObject: accetta solo un argomento. Stai pensando a arrayWithObjects: – Adolfo

risposta

6

Davvero strano. Funziona ancora bene per me, sia in simulatore di iOS4 e il dispositivo (si tratta di un vero e proprio frammento di lavoro dal mio codice):

NSArray *laterContent = [NSArray arrayWithObjects: @"Maybe later", nil]; 
UISegmentedControl *later = [[UISegmentedControl alloc] initWithItems:laterContent]; 
CGRect frame = CGRectMake( 20, 
          98, 
          self.alert.bounds.size.width/2 - 30, 
          30); 

later.frame = frame; 

later.selectedSegmentIndex = -1; 

[later addTarget:self action:@selector(laterAction:) forControlEvents:UIControlEventValueChanged]; 

later.segmentedControlStyle = UISegmentedControlStyleBar; 
later.tintColor = [UIColor colorWithRed:130.0f/255.0f green:74.0f/255.0f blue:54.0f/255.0f alpha:0.8f]; 
later.momentary = YES; 
later.alpha = 0.9; 
+1

Quando premo il pulsante del segmento singolo, chiama il selettore ma non mostra il pulsante premuto. Mi manca qualcosa? –

0

Ben due possibilità:

1) Creare un 'immagine sfondo impostato come singolo punto del UISegmentedControl

pulsante e se il vostro SegmentedControl è una variabile di classe basta sostituire il @property

@property (nonatomic, retain) IBOutlet UIButton *button; 

Nella viewDidLoad funzione aggiungere il seguente

-(void) viewDidLoad 
{ 
    [super viewDidLoad]; 
    ... 
    self.button = [UIButton alloc] init]; 
    [self.button setBackgroundImage:[UIImage imageNamed:@"segmentedDot.png"] forState:(UIControlState)UIControlStateNormal]; 
} 

2) Imposta la quantità di segmenti su tre del tuo UISegmentedControl e successivamente imposta la larghezza su 20 - ora verrà mostrato solo il punto nel mezzo. Non dimenticare, se l'utente interagisce con UISegmentedControl, imposta nuovamente il currentElement sul secondo segmento, altrimenti il ​​punto sarà in grigio chiaro anziché bianco.

3) Posizionare un pulsante o una piccola vista sul secondo punto indesiderato di UISegmentedControl in InterfaceBuilder. Assicurati che lo sfondo sia chiaro. Quando si utilizza un pulsante, impostare lo stato di "interazione utente" nella finestra di ispezione attributi su disattivato. Come tipo avrei scelto "personalizzato" dal momento che non avrai alcuni bordi nel tuo pulsante;) Ora maschio di nuovo sicuro, che sempre il primo punto è l'elemento attivo.

Tuttavia penso che la soluzione uno dovrebbe essere il modo in cui dovresti andare, dal momento che Apple ha pensato a qualcosa, quando hanno disabilitato il 1-punto-SegmentedControl. Dato che stai usando il controllo come pulsante, l'elemento che stai cercando fpr dovrebbe essere un pulsante. ;)

7

Hai provato questo:

[myButton removeAllSegments]; 
[myButton insertSegmentWithTitle:@"Press this" atIndex:0 animated:NO]; 
+0

Hai provato questo? –

+0

Sì, l'ho provato e funzionava per il dispositivo ma non per il simulatore. Nel simulatore ho ottenuto un pulsante vuoto (come non visibile affatto) ma è apparso benissimo sul dispositivo e in effetti è in un'app di spedizione. – Adolfo

+0

Questo ha funzionato per me. Grazie!! – Das

0

Non c'è alcuna soluzione in iOS 4. Se avete bisogno di questa funzionalità, il file di un bug (richiesta di miglioramento) a bugreport.apple.com.

+0

È strano pensare di chiedere il ripristino di una vecchia funzionalità come miglioramento. Non è ancora chiaro * perché * questo è un problema ... –

3

non è esattamente una soluzione di codice relativi ma: mi ha colpito un problema simile e ha finito per disegno le mie stesse risorse dall'aspetto simile in Photoshop. Non era terribilmente difficile da fare e rimosso un particolare "odore di codice", IMO.

1

Ho trovato se si dispone di un progetto precedente con un UISegmentedControl a segmento singolo, è possibile aprire sia quel progetto che il nuovo in Interface Builder e trascinare (o copiare/incollare) il singolo segmento UISegmentedControl sul nuovo controller di visualizzazione . Funzionerà bene sia nella tua app che in Interface Builder, ma non modificare il numero di segmenti da 1 a nessun altro dato che non ti consente di tornare indietro. Utilizzo Xcode 4.6.2 e iOS 6.

1

L'editor di Interface Builder non consente di modificare il numero di segmenti in modo che sia inferiore a 1, ma è possibile eseguire un controllo segmentato in IB modificando il file. xib xml manualmente.

  1. Fare clic destro sul .xib che contiene il controllo segmentato
  2. Scegli Open As ->Source Code dal menu a comparsa.
  3. Find "<segments> che è l'inizio della matrice xml di segmenti Il tutto dovrebbe essere simile:.

    <segments> 
        <segment title="Segment 1 Title"/> 
        <segment title="Segment 2 Title"/> 
    </segments> 
    
  4. basta cancellare <segment title="Segment 2 Title"/> quindi non è solo un elemento del segmento

  5. clic destro. ancora il .xib e scegliere Open As -> Interface Builder - iOS per tornare al generatore di interfacce

Si dovrebbe anche impostare il controllo segmentato sul mod "momentaneo" e.

Non ricevo errori nella compilazione o nell'esecuzione di questo. Ovviamente, questo è un trucco e potrebbe rompere le cose in alcune circostanze o in una futura versione di iOS.

+0

funziona come un fascino! – Soko

0

È inoltre possibile utilizzare removeSegmentAtIndex:animated:. Se crei un controllo segmentato in uno storyboard o in uno xib con due segmenti, puoi rimuoverne uno in questo modo:

[self.sortButton removeSegmentAtIndex:1 animated:NO]; 
Problemi correlati