Получить UIBarButtonSystemItem обратно из UIBarButtonItem

пытаясь выполнить единичный тест, я установил правильный UIBarButtonSystemItem на кнопках навигатора.

Я могу вернуть стиль, но не могу найти способ получить UIBarButtonSystemItem

перечисления, которые были установлены для кнопок. Это терпит неудачу, потому что стиль отличается от перечисления, чем

UIBarButtonSystemItem:

- (void)test_init_should_set_left_right_barButtonItems { UIBarButtonItem *left = mainVCSUT.navigationItem.leftBarButtonItem; UIBarButtonItem *right = mainVCSUT.navigationItem.rightBarButtonItem; [Assert isNotNil:left]; [Assert isNotNil:right]; UIBarButtonItemStyle leftStyle = left.style; UIBarButtonItemStyle rightStyle = right.style; [Assert that:[The int:leftStyle] is:[Equal to:[The int:UIBarButtonSystemItemRefresh]]]; [Assert that:[The int:rightStyle] is:[Equal to:[The int:UIBarButtonSystemItemSearch]]]; } 

На iOS 6.1 по крайней мере (я еще не тестировал другую версию) UIBarButtonItem имеет systemItem метод systemItem метода, который возвращает значение, переданное в инициализатор. Вы можете легко получить доступ к нему с помощью ключевого значения:

 UIBarButtonSystemItem systemItemIn = UIBarButtonSystemItemAdd; UIBarButtonItem *item = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:systemItemIn target:nil action:NULL]; NSNumber *value = [item valueForKey:@"systemItem"]; UIBarButtonSystemItem systemItemOut = [value integerValue]; NSLog(@"systemItemIn = %d, systemItemOut = %d", systemItemIn, systemItemOut); 

Если это не сработает, вы можете создать typedef для внутренней анонимной структуры, которая является переменной UIBarButtonItem класса UIBarButtonItem которая хранит эту информацию, и использует имя личного ivar и время выполнения Objective C, как показано ниже:

 //Copied from UIBarButtonItem.h, this is the struct used for the _barButtomItemFlags ivar typedef struct { unsigned int enabled:1; unsigned int style:3; unsigned int isSystemItem:1; unsigned int systemItem:7; unsigned int viewIsCustom:1; unsigned int isMinibarView:1; unsigned int disableAutosizing:1; unsigned int selected:1; unsigned int imageHasEffects:1; } FlagsStruct; // In our test code // Instantiate a bar button item UIBarButtonSystemItem systemItemIn = UIBarButtonSystemItemAdd; UIBarButtonItem *item = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:systemItemIn target:nil action:NULL]; // Set up variables needed for run time functions Class barItemClass = [item class]; BOOL foundIt = NO; // We check this flag to make sure we found the ivar we were looking for ptrdiff_t ivarOffset = 0; // This will be the offset of _barButtomItemFlags within the bar button item object // Iterate through all of UIBarButtonItem's instance variables unsigned int ivarCount = 0; Ivar *ivarList = class_copyIvarList(barItemClass, &ivarCount); for (int i = 0; i < ivarCount; i++) { Ivar ivar = ivarList[i]; const char *ivarName = ivar_getName(ivar); if (!strcmp(ivarName, "_barButtonItemFlags")) { // We've found an ivar matching the name. We'll get the offset and break from the loop foundIt = YES; ivarOffset = ivar_getOffset(ivar); break; } } free(ivarList); if (foundIt) { // Do a little pointer math to get the FlagsStruct - this struct contains the system item value. void *itemPointer = (__bridge void *)item; FlagsStruct *flags = itemPointer + ivarOffset; UIBarButtonSystemItem systemItemOut = flags->systemItem; NSLog(@"systemItemIn = %d, systemItemOut = %d", systemItemIn, systemItemOut); BOOL equal = (systemItemIn == systemItemOut); if (equal) { NSLog(@"yes they are equal"); } else { NSLog(@"no they are not"); } } else { // Perhaps Apple changed the ivar name? NSLog(@"didn't find any such ivar :("); } 

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

  • Скрыть разделительную линию на одном UITableViewCell
  • Почему `viewWillAppear` устанавливает` анимированный` значение true даже при представлении `present (_, animated: false, _)`?
  • - выдает исключение, говорящее, что длина слишком велика, но это не
  • iOS - попытка повернуть текстовую метку, и ярлык исчезает
  • iPhone crash - сообщение отправлено на освобожденный экземпляр
  • Каков лучший подход к обмену данными между родительским и дочерним контроллерами?
  • Как записать все касания пользователя в приложении iPhone
  • Курсор не отображается при вызове функции startFirstResponder
  • UITabBarController в раскадровке скрывает содержимое UITabBarItems
  • ModalView в верхней части UITabBarController во время запуска приложения
  • Получить UINavController из подпрограммы UIView?
  • Interesting Posts

    Невозможно программно установить множитель NSLayoutConstraint в swift … "Невозможно присвоить результат этого выражения

    Имитация местоположения на реальном устройстве iOS

    автоматическая ссылка отключена в ios

    Захват снимка экрана UIView – медленная производительность

    AVPlayerItem начальный timedMetadata не наблюдается (KVO)

    Просмотр состояния объекта / свойства в Xcode при отладке

    Немодифицированная проблема смешивания приложений Apple GLPaint iOS7

    OpenGL ES на загрузке текстур iOS – как я могу получить из файла RGBA8888 .png текстуру RGB565?

    Каковы преимущества LLDB над GDB в разработке iOS?

    Массив изображения Firebase

    В приложении отсутствует требуемое право com.apple.developer.icloud-services '

    максимальная скорость управления в комплекте спрайтов

    Как правильно обновить массив вершин в OpenGL Es 2.0?

    Удаление нескольких пространств в NSString

    Показать экран при первом запуске только в iOS

    Давайте будем гением компьютера.