2010-06-13 2 views
6

Dans une application iPhone, nous pouvons faire une UIBarButtonItem en utilisant le code suivant:Comment obtenir le bouton embeded de UIBarButtonItem

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

le UIBarButtonItem généré a un système fourni par « action » icon.My question : comment obtenir UIButton interne de cette UIBarButtonItem et ajouter cette UIButton à un autre UIView? Qui peut me montrer du code? merci d'avance

Répondre

9

Vous ne pouvez pas. UIBarButtonItem hérite de UIBarItem qui hérite de NSObject. Aucune de ces classes n'a une méthode pour obtenir un UIButton, car UIBarButtonItem n'est pas un UIButton. Par contre, vous pouvez créer un UIBarButtonItem à partir d'un UIButton - voir an answer I gave to a different question pour plus d'informations (qui fonctionne en l'ajoutant en tant que «vue personnalisée»).

+0

merci Shaggy Frog – Jagie

+4

+1 pour "contrariwise". –

3

Je ne pense pas que vous pouvez obtenir le bouton intégré dans tous les cas. Cependant, si vous créez un bouton à l'aide d'une vue personnalisée, par exemple, en utilisant un bouton, on peut obtenir ce bouton plus tard en utilisant ce code:

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

La hiérarchie de la vue personnalisée devrait comme ceci:

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

Espère que ça aide.

1

Vous ne pouvez pas accéder au bouton intégré à l'intérieur UIBarButtonItem à travers le UIBarButtonItem

ce que vous pouvez faire pour relier le bouton intérieur à l'aide du constructeur d'interface avec une nouvelle sortie et comme celui-ci, vous pouvez accéder au bouton directement vous pouvez trouver le bouton à l'intérieur des objets voir lorsque vous ouvrez le fichier nib, vous pouvez le lier avec une nouvelle prise

0

Juste pour étendre Brians réponse si votre UIBarButton est faite avec vue sur mesure ...

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

Juste ajouter un peu de vérification d'erreur, vous ne savez jamais quand Apple ou un autre développeur changera un jour la hiérarchie de mise en page. Depuis cette approche est vraiment sujet à erreur à long terme.

+0

C'est cassant et très susceptible de se casser. Apple a apporté plusieurs changements majeurs à ses hiérarchies de vues dans les dernières mises à jour majeures du système d'exploitation. Je ne recommanderais donc pas cette solution. – DiscDev

6

Accès à la propriété "CustomView" de l'élément de bouton de la barre est une solution possible:

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 
} 

Essayez ceci. Cela fonctionne vraiment pour moi :)

0

Voici une solution qui reproduit avec précision l'image UIBarButtonItem qui est autrement acquise en utilisant le type de système UIBarButtonSystemItemAction.À titre d'exemple, le nouveau UIButton est inséré dans un MKAnnotationView:

Créer un fichier de catégorie qui contient cette méthode:

@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 

Dans le délégué MKMapView, ajoutez cette implémentation (adapter au choix):

- (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; 
} 
Questions connexes