2010-06-13 18 views
6

ait gömülmüş düğmeye almak nasıl, aşağıdaki kodu kullanarak bir UIBarButtonItem yapabilirsiniz: Oluşturulan UIBarButtonItem sistem tarafından sağlanan "eylem" vardırbir iPhone uygulamasında UIBarButtonItem

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

icon.My sorudur : Bu UIBarButtonItem'in iç UIButton'u nasıl alabilir ve bu UIButton'u başka bir UIView'e nasıl ekleyebilirim? Bana kim kod gösterebilir? Şimdiden teşekkürler

cevap

9

Yapamazsınız. UIBarButtonItem, NSObject'dan alınan UIBarItem öğesinden devralınır. Bu sınıfların hiçbiri UIButton almak için bir yönteme sahip değildir, çünkü UIBarButtonItemUIButton değildir.

Tersi durumda, UIButton numaralı telefondan UIBarButtonItem oluşturabilirsiniz - daha fazla bilgi için bkz. an answer I gave to a different question ("özel görünüm" olarak ekleyerek çalışır).

+0

"contrariwise" için Shaggy Kurbuğuna – Jagie

+4

+1 teşekkürler. –

3

Gömülü düğmeyi her durumda alabilirsiniz sanmıyorum.

|--UIView 
    |--UIButton 
    |--UIImageView 
: Bu isterim

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

özel görünüm hiyerarşisini: Bir düğmeyi kullanarak, örneğin, özel bir görünüm kullanarak bir düğme oluşturmak Ancak, daha sonra bu kodu kullanarak o düğmeye alabilirsiniz

Yardımcı olan yardımlar.

1

Sen UIBarButtonItem aracılığıyla UIBarButtonItem içine gömülü düğmeye erişemez

yeni bir çıkış ile ve düğmeye doğrudan erişebilirsiniz böyle arayüzü geliştirici ile iç düğmesini bağlamak için bunu yapabileceklerini nesneleri uç dosyayı açtığınızda o zaman yeni bir çıkış ile bağlayabilirsiniz görüntülemek içeride düğmeye bulabilirsiniz

sizin UIBarButton özel görünümle yapılması halinde sadece Brians cevabı uzatmak için
0

...

if ([myBarButton.customView.subviews.lastObject isKindOfClass:[UIButton class]]) 
{ 
    UIButton * btn = ((UIButton *)(myBarButton.customView.subviews.lastObject)); 
} 
Sadece bir miktar hata denetimi eklediğinizde, elmanın veya başka bir geliştiricinin bir gün düzen hiyerarşisini değiştireceğini asla bilemezsiniz. Bu yaklaşım gerçekten hata uzun vadeli olduğu için.
+0

Bu kırılgandır ve kırılma olasılığı yüksektir. Apple, son birkaç ana işletim sistemi güncellemelerinde kendi görünüm hiyerarşileri için birkaç önemli değişiklik yaptı, bu yüzden bu çözümü önermem. – DiscDev

0

Çubuk düğme öğenizi initWithCustomView ile oluşturduysanız, özel görünüm özelliğine erişin ve UIButton'a yayınlayın.

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 
} 

bu deneyin: çubuk düğme öğesinin "customView" özelliği erişme

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

6

olası bir çözümdür. Benim için gerçekten işe yarıyor :)

0

UIBarButtonSystemItemAction sistem türüyle aksi halde elde edilen UIBarButtonItem görüntüsünü tam olarak kopyalayan bir çözüm.Bir örnek olarak, yeni oluşturulan UIButton bir MKAnnotationView sokulur: MKMapView temsilci olarak

@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 

bu uygulama (ve böylece istenen uyum) ekleyin:

bu yöntemi içeren bir kategori dosyası oluşturma

- (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; 
} 
İlgili konular