2010-07-16 13 views
7

En mi código estoy usando un UISegmentedControl como un "botón" con solo UN segmento y la propiedad momentary establecida en YES. En versiones del SDK anterior a iOS 4, esto no era un problema, pero parece que ahora iOS 4 requiere que haya al menos 2 segmentos. El siguiente código genera una excepción:Usando UISegmentedControl como botón

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

y ahora en el Interface Builder ni siquiera se puede crear un UISegmentedControl con menos de 2 segmentos. Registra el siguiente error al construir:

"La cantidad de segmentos de propiedad de un control segmentado debe ser mayor o igual a 2".

Estoy algo perplejo. Cualquier solución alternativa para esto? Traté de crear un UISegmentedControl con dos botones y luego eliminar uno programáticamente y eso "funciona", ya que no causa la falla de la aplicación. Obtengo un botón en iOS 3 y nada en iOS 4. ¿Alguna idea?

+0

Esto me está molestando también. Lo estoy usando como un reemplazo para el botón "cristal", que Apple aún no ha puesto en la parte pública del SDK. –

+0

Parece que olvidó nada como un segundo elemento en la matriz de títulos. Ver mi respuesta a continuación para el código de trabajo. – spbfox

+0

arrayWithObject: solo toma un argumento. Estás pensando arrayWithObjects: – Adolfo

Respuesta

6

Realmente extraño. Todavía me da buenos resultados tanto en el simulador de iOS4 y el dispositivo (esto es un verdadero fragmento de trabajo de mi código):

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

Cuando presiono el botón de segmento único, llama al selector pero no muestra el botón que se está presionando. ¿Extraño algo? –

0

Bien dos posibilidades:

1) Crear una imagen de fondo conjunto como el único punto de la UISegmentedControl

botón y Si su SegmentedControl es una variable de clase basta con sustituir el @property

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

En el viewDidLoad-función, agregue el siguiente

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

2) Establezca la cantidad de segmentos en tres de su UISegmentedControl y luego ajuste el ancho en 20; ahora solo se mostrará el punto en el medio. No olvide, si el usuario interactúa con el UISegmentedControl, configure currentElement nuevamente en el segundo segmento, de lo contrario, el punto estará en gris claro en lugar de blanco.

3) Coloque un botón o una pequeña vista sobre el segundo punto no deseado del UISegmentedControl en InterfaceBuilder. Asegúrate de que el color de fondo sea par. Cuando está utilizando un botón, establece el estado de "interacción del usuario" en el inspector de atributos en deshabilitado. Como tipo I elegiría "personalizado" ya que no tendrá algunos bordes en su botón;) Ahora, macho nuevamente seguro, que siempre el primer punto es el elemento activo.

Sin embargo, creo que la solución uno debería ser la forma en que debería ir, ya que Apple pensó algo al respecto, cuando deshabilitaron el 1-dot-SegmentedControl. Como está usando el Control como un botón, el Elemento que está buscando fpr debería ser un botón. ;)

7

Has probado esto:

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

¿Has probado esto? –

+0

Sí, lo había intentado y funcionaba para el dispositivo, pero no para el simulador. En el simulador obtuve un botón en blanco (como no visible en absoluto) pero se mostró bien en el dispositivo y, de hecho, está en una aplicación de envío. – Adolfo

+0

Esto funcionó para mí. ¡¡Gracias!! – Das

0

hay ninguna solución en IOS 4. Si necesita esta funcionalidad, un bug (solicitud de mejora) en bugreport.apple.com.

+0

Es extraño pensar en pedir que se restaure la funcionalidad anterior como una mejora. Todavía no está claro * por qué * esto es un problema ... –

3

no es exactamente una solución relacionadas con el código, sino: me golpeó un problema similar y terminó dibujo mis propios recursos de aspecto similar en Photoshop. No fue terriblemente difícil de hacer y eliminó un mal olor de código en particular, IMO.

1

Encontré que si tiene un proyecto anterior con un UISegmentedControl de segmento único, puede abrir tanto ese proyecto como el nuevo en Interface Builder y arrastrar (o copiar/pegar) el UISegmentedControl de un solo segmento a su nuevo controlador de vista . Funcionará bien tanto en su aplicación como en Interface Builder, simplemente no cambie la cantidad de segmentos de 1 a nada, ya que no le permitirá volver atrás. Estoy usando Xcode 4.6.2 e iOS 6.

1

El editor en Interface Builder no le permitirá cambiar el número de segmentos para que sea menor que 1, pero puede hacer un control segmentado en IB editando el. xib xml manualmente

  1. Haga clic derecho sobre el .xib que contiene el control segmentado
  2. Elija Open As ->Source Code en el menú emergente.
  3. Find "<segments> que es el comienzo de la matriz xml de segmentos Todo esto debe verse como:.

    <segments> 
        <segment title="Segment 1 Title"/> 
        <segment title="Segment 2 Title"/> 
    </segments> 
    
  4. acaba de eliminar <segment title="Segment 2 Title"/> por lo que no es sólo un elemento segmento

  5. clic derecho. el .xib nuevamente y elija Open As -> Interface Builder - iOS para volver al constructor de interfaz.

Probablemente también deba establecer el control segmentado en modo "momentáneo" mi.

No obtengo ningún error al compilar o ejecutar esto. Por supuesto, este es un truco, y puede romper las cosas en algunas circunstancias o en un futuro lanzamiento de iOS.

+0

funciona como un encanto! – Soko

0

También puede usar removeSegmentAtIndex:animated:. Si crea un control segmentado en un guión gráfico o xib con dos segmentos, puede eliminar uno como este:

[self.sortButton removeSegmentAtIndex:1 animated:NO]; 
Cuestiones relacionadas