2010-06-13 7 views
6

Trong một ứng dụng iPhone, chúng ta có thể làm cho một UIBarButtonItem bằng cách sử dụng đoạn mã sau:Làm thế nào để có được những nút embeded của UIBarButtonItem

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

các UIBarButtonItem tạo ra có một "hành động" hệ thống cung cấp icon.My câu hỏi là : làm thế nào để có được UIBarButtonItem bên trong UIButton và thêm UIButton này để UIView khác? ai có thể cho tôi xem một số mã? cảm ơn trước

Trả lời

9

Bạn không thể. UIBarButtonItem được kế thừa từ UIBarItem được kế thừa từ NSObject. Không có lớp nào trong số các lớp đó có phương thức nhận UIButton, vì UIBarButtonItem không phải là UIButton.

Ngược lại, bạn có thể tạo UIBarButtonItem từ UIButton - xem an answer I gave to a different question để biết thêm thông tin (hoạt động bằng cách thêm nó dưới dạng "chế độ xem tùy chỉnh").

+0

nhờ Shaggy Frog – Jagie

+4

+1 cho "contrariwise". –

3

Tôi không nghĩ bạn có thể nhận nút được nhúng trong mọi trường hợp. Tuy nhiên, nếu bạn tạo một nút sử dụng một giao diện tùy chỉnh, ví dụ, sử dụng một nút, chúng ta có thể có được nút mà sau này sử dụng mã này:

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

Các hệ thống các quan điểm tùy chỉnh nên như thế này:

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

Hy vọng điều đó sẽ hữu ích.

1

Bạn không thể truy cập vào nút nhúng bên trong UIBarButtonItem qua UIBarButtonItem

gì bạn có thể làm điều đó để liên kết các nút bên trong bằng cách sử dụng xây dựng giao diện với một cửa hàng mới và như thế này bạn có thể truy cập vào các nút trực tiếp bạn có thể tìm thấy nút bên trong đối tượng xem khi bạn mở tập tin nib sau đó bạn có thể liên kết nó với một ổ cắm mới

0

Chỉ cần để mở rộng Brians câu trả lời nếu UIBarButton của bạn được thực hiện với giao diện tùy chỉnh ...

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

Chỉ cần thêm một chút kiểm tra lỗi, bạn sẽ không bao giờ biết khi nào thì một nhà phát triển nào đó sẽ thay đổi thứ bậc bố cục. Vì cách tiếp cận này thực sự dễ xảy ra lỗi trong thời gian dài.

+0

Đây là giòn và rất có khả năng bị vỡ. Apple đã thực hiện một số thay đổi lớn cho hệ thống phân cấp khung nhìn của họ trong một số bản cập nhật hệ điều hành lớn cuối cùng, vì vậy tôi sẽ không khuyên bạn nên giải pháp này. – DiscDev

6

Truy cập vào "customView" tài sản của mục nút thanh là một trong những giải pháp khả thi:

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 
} 

Hãy thử điều này. Nó thực sự làm việc cho tôi :)

0

Đây là một giải pháp sao chép chính xác hình ảnh UIBarButtonItem mà nếu không có được bằng cách sử dụng loại hệ thống UIBarButtonSystemItemAction.Như một ví dụ, mới được tạo ra UIButton được đưa vào một MKAnnotationView:

Tạo một file loại có chứa phương pháp này:

@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 

Trong MKMapView đại biểu, thêm thi này (thích ứng như mong muốn):

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