开发者

How to get the embedded button of UIBarButtonItem

In an iPhone app,we can make a UIBarButtonItem by using the following code:

UIBarButtonItem *bbix=[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAction开发者_运维知识库 target:nil action:nil];

the generated UIBarButtonItem has a system-provided "action" icon.My question is :how to get this UIBarButtonItem's inner UIButton and add this UIButton to another UIView? who can show me some code?


You can't. UIBarButtonItem inherits from UIBarItem which inherits from NSObject. None of those classes has a method to get a UIButton, because UIBarButtonItem isn't a UIButton.

Contrariwise, you can create a UIBarButtonItem from a UIButton -- see an answer I gave to a different question for more info (which works by adding it as a "custom view").


Accessing the "customView" property of the bar button item is one possible solution:

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
}

Try this out. It really works for me :)


I don't think you can get the embedded button in any case. However, if you create a button using a custom view, for example, using a button, we can get that button later using this code:

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

The hierarchy of the custom view should like this:

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

Hopes that helps.


You can't access the embedded button inside UIBarButtonItem through the UIBarButtonItem

what you can do it to link the inner button using the interface builder with a new outlet and like this you can access to the button directly you can find the button inside the objects view when you open the nib file then you can link it with a new outlet


Just to extend Brians answer if your UIBarButton is made with custom view...

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

Just add a little bit of error checking, you never know when apple or another developer will one day change the layout hierarchy. Since this approach is really error prone long term.


If you have created your bar button item via initWithCustomView, simply access the custom view property and cast to UIButton.

http://cocoatouch.blog138.fc2.com/blog-entry-214.html


Here is a solution that precisely replicates the UIBarButtonItem image that is otherwise acquired by using the UIBarButtonSystemItemAction system type. As an example, the newly created UIButton is inserted into an MKAnnotationView:

Create a category file that contains this method:

@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

In the MKMapView delegate, add this implementation (adapt as desired):

- (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;
}
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜