Как получить встроенную кнопку UIBarButtonItem - PullRequest
7 голосов
/ 13 июня 2010

В приложении для iPhone мы можем создать UIBarButtonItem, используя следующий код:

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

у сгенерированного UIBarButtonItem есть системный значок «действие».внутреннюю UIButton и добавить эту UIButton в другой UIView?кто может показать мне какой-нибудь код?

Ответы [ 7 ]

12 голосов
/ 13 июня 2010

Вы не можете. UIBarButtonItem наследуется от UIBarItem, который наследуется от NSObject. Ни у одного из этих классов нет метода для получения UIButton, потому что UIBarButtonItem не является UIButton.

Наоборот, вы можете создать UIBarButtonItem из UIButton - см. ответ, который я дал на другой вопрос для получения дополнительной информации (который работает, добавив его как «пользовательский вид») .

6 голосов
/ 20 сентября 2014

Доступ к свойству "customView" элемента панели кнопок является одним из возможных решений:

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
}

Попробуйте это.Это действительно работает для меня:)

3 голосов
/ 02 июля 2013

Я не думаю, что вы можете получить встроенную кнопку в любом случае. Однако, если вы создаете кнопку с помощью пользовательского представления, например, с помощью кнопки, мы можем получить эту кнопку позже, используя этот код:

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

Иерархия пользовательского представления должна выглядеть следующим образом:

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

Надежды, которые помогают.

1 голос
/ 07 августа 2013

Вы не можете получить доступ к встроенной кнопке внутри UIBarButtonItem через UIBarButtonItem

, что вы можете сделать, чтобы связать внутреннюю кнопку с помощью построителя интерфейса с новой розеткой, и таким образом вы можете получить доступ к кнопке напрямуюВы можете найти кнопку в окне объектов при открытии файла пера, а затем связать его с новым выходом

0 голосов
/ 03 августа 2015

Вот решение, которое точно копирует образ UIBarButtonItem, полученный в противном случае с использованием системного типа UIBarButtonSystemItemAction. Например, недавно созданный UIButton вставляется в MKAnnotationView:

Создайте файл категории, который содержит этот метод:

@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

В делегате MKMapView добавьте эту реализацию (адаптируйте по желанию):

- (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 голосов
/ 23 апреля 2014

Если вы создали элемент кнопки панели через initWithCustomView, просто получите доступ к свойству пользовательского представления и приведите к UIButton.

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

0 голосов
/ 28 марта 2014

Просто чтобы расширить ответ Brians, если ваш UIBarButton сделан с настраиваемым представлением ...

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

Просто добавьте немного проверки ошибок, вы никогда не знаете, когда однажды разработчик Apple или другой разработчик изменитиерархия макетов.Поскольку этот подход действительно подвержен ошибкам в долгосрочной перспективе.

...