2010-06-13 22 views
6

En una aplicación para el iPhone, podemos hacer una UIBarButtonItem usando el siguiente código:Como llegar el botón Embebido de UIBarButtonItem

UIBarButtonItem *bbix=[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAction target:nil action:nil]; 

la UIBarButtonItem generado tiene una "acción" proporcionado por el sistema pregunta es icon.My : ¿cómo obtener el UIButton interno de este UIBarButtonItem y agregar este UIButton a otro UIView? ¿Quién puede mostrarme un código? gracias de antemano

Respuesta

9

No se puede. UIBarButtonItem hereda de UIBarItem que hereda de NSObject. Ninguna de esas clases tiene un método para obtener un UIButton, porque UIBarButtonItem no es un UIButton.

Por el contrario, puede crear un UIBarButtonItem desde un UIButton - vea an answer I gave to a different question para obtener más información (que funciona al agregarlo como una "vista personalizada").

+0

gracias Shaggy Frog – Jagie

+4

+1 por "contrariwise". –

3

No creo que pueda obtener el botón incrustado en ningún caso. Sin embargo, si se crea un botón mediante una vista personalizada, por ejemplo, usando un botón, podemos conseguir que el botón más adelante utilizando este código:

((UIButton *)(theBarButtonItem.customView.subviews.lastObject)); 

La jerarquía de la vista personalizada debe desea:

|--UIView 
    |--UIButton 
    |--UIImageView 

Esperanzas que ayuden.

1

No se puede acceder al botón incrustado en el interior a través de la UIBarButtonItem UIBarButtonItem

lo que puede hacer para enlazar el botón interno mediante el constructor de interfaces con un nuevo punto de venta y de esta manera se puede acceder al botón directamente se puede encontrar el botón en el interior de los objetos de la vista cuando se abre el archivo semilla entonces se puede enlazar con un nuevo punto de venta

0

Sólo para extender la respuesta de Brians si su UIBarButton se hace con vista personalizada ...

if ([myBarButton.customView.subviews.lastObject isKindOfClass:[UIButton class]]) 
{ 
    UIButton * btn = ((UIButton *)(myBarButton.customView.subviews.lastObject)); 
} 

Simplemente agregue un poco de comprobación de errores, nunca se sabe cuándo Apple u otro desarrollador cambiarán un día la jerarquía de diseño. Dado que este enfoque es realmente propenso a errores a largo plazo.

+0

Esto es frágil y muy propenso a romperse. Apple ha realizado varios cambios importantes en sus jerarquías de vista en las últimas actualizaciones principales del sistema operativo, por lo que no recomendaría esta solución. – DiscDev

6

Acceso a la propiedad "CustomView" del tema botón de la barra es una solución posible:

UIBarButtonItem *item = (UIBarButtonItem *)[self.navigationItem.rightBarButtonItems objectAtIndex:0]; 
        OR 
UIBarButtonItem *item = (UIBarButtonItem *)[self.navigationItem.rightBarButtonItem]; 

UIButton *myBtn; 

if([item.customView isKindOfClass:[UIButton class]]) 
{ 
    myBtn = (UIButton*)item.customView; 
} 

if(myBtn) 
{ 
    // do something 
} 

Trate de hacer esto. Realmente funciona para mí :)

0

Aquí hay una solución que replica exactamente la imagen UIBarButtonItem que se adquiere utilizando el tipo de sistema UIBarButtonSystemItemAction.A modo de ejemplo, el UIButton recién creado se inserta en una MKAnnotationView:

Crear un archivo de categoría que contiene este método:

@implementation UIImage (Custom) 

+ (UIImage *)actionButtonImage 
{ 
    CGRect rect = CGRectMake(0, 0, 20, 27); 

    UIGraphicsBeginImageContextWithOptions(rect.size, NO, 0); 

    [[UIColor colorWithRed:3/255.0 green:122/255.0 blue:1 alpha:1] set]; 

    UIBezierPath *path = [UIBezierPath bezierPath]; 

    // Box 
    [path moveToPoint:CGPointMake(7, 8)]; 
    [path addLineToPoint:CGPointMake(1, 8)]; 
    [path addLineToPoint:CGPointMake(1, 26)]; 
    [path addLineToPoint:CGPointMake(19, 26)]; 
    [path addLineToPoint:CGPointMake(19, 8)]; 
    [path addLineToPoint:CGPointMake(13, 8)]; 

    // Arrow shaft 
    [path moveToPoint:CGPointMake(10, 17)]; 
    [path addLineToPoint:CGPointMake(10, 1)]; 

    // Arrow head 
    [path moveToPoint:CGPointMake(6, 4.5)]; 
    [path addLineToPoint:CGPointMake(10, 0.5)]; 
    [path addLineToPoint:CGPointMake(14, 4.5)]; 

    [path stroke]; 

    UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 

    return image; 
} 

@end 

En el delegado MKMapView, agregue esta implementación (adaptarse a medida que se desee):

- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id<MKAnnotation>)annotation 
{ 
    MKPinAnnotationView *view = [[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"Item"]; 
    view.canShowCallout = YES; 

    UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom]; 
    UIImage *actionImage = [UIImage actionButtonImage]; 
    [button setImage:actionImage forState:UIControlStateNormal]; 
    button.frame = CGRectMake(0, 0, actionImage.size.width, actionImage.size.height); 
    view.leftCalloutAccessoryView = button; 

    return view; 
} 
Cuestiones relacionadas