Многие объяснения уже присутствуют, чтобы объяснить, как это происходит и как это исправить, но вы также должны следовать рекомендациям, чтобы избежать NullPointerException
вообще.
См. также: A хороший список лучших практик
Я бы добавил, очень важно, хорошо использовать модификатор final
. Использование "окончательной" модификатор, когда это применимо в Java
Сводка:
final
для обеспечения хорошей инициализации. @NotNull
и @Nullable
if("knownObject".equals(unknownObject)
valueOf()
поверх toString (). StringUtils
StringUtils.isEmpty(null)
. При попытке скрыть UIBarButtonItem, необходимо будет на самом деле изменить содержание родительской панели. Если это будет UIToolBar, необходимо будет установить массив элементов панели на массив, который не включает объект.
NSMutableArray *items = [[myToolbar.items mutableCopy] autorelease];
[items removeObject: myButton];
myToolbar.items = items;
Просто установите скрытое свойство кнопки на истинный:
myButton.hidden = YES;
Установите элемент полосы на ноль
Например:
self.navigationItem.leftBarButtonItem = nil;
Это то, что я сделал для элементов кнопок, которые не были частью панели навигации (где Blank.png - это созданное мной пустое изображение, которое тот же размер изображения, которое оно заменяет):
theButton.enabled = NO;
theButton.image = [UIImage imageNamed: @"Blank.png"];
Итак, я попробовал победный подход Бена, но в итоге он оказался неверным для моих целей - хотя я уверен, что все зависит от того, что вы пытаетесь сделать. Я пытался показать кнопку навигационной панели только при определенных условиях, а затем скрыть ее, как только условие больше не выполняется (в моем случае это кнопка "Done", используемая для скрытия клавиатуры, связанной с UITextView. Она должна отображаться только тогда, когда пользователь набирает текст в текстовом представлении). Мои шаги были следующими:
Я добавил UIBarButtonItem в качестве свойство в моем UIViewController класса. Я инстанцировал его в initWithNibName.
Я назначил свойство UIBarButtonItem в качестве свойства rightBarButtonItem в навигационной панели, как только как только пользователь начинает вводить текст в текстовом представлении.
Я установил свойство UIBarButtonItem на nil, когда пользователь заканчивает вводить текст.
Это работает как шарм. Ниже я добавляю несколько примеров кода.
Сначала я инстанцирую кнопку в методе init моего контроллера представления:
barButtonItemDone = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(done:)];
Затем я устанавливаю ее как кнопку правой панели в методе делегата, который вызывается, как только пользователь начинает редактировать текстовое представление:
self.navigationItem.rightBarButtonItem=[self barButtonItemDone];
Наконец, когда сама кнопка нажимается, вызывается метод под названием "done", и я просто устанавливаю rightBarButtonItem в nil внутри этого метода:
self.navigationItem.rightBarButtonItem=nil;
Если все, что нужно скрыть, это кнопку "Назад" в навигационной панели, есть более простой способ:
self.navigationItem.hidesBackButton = YES;
Цитата из документации разработчика:
hidesBackButton
Булево значение, определяющее, скрыта ли кнопка "Назад".
@property(nonatomic, assign) BOOL hidesBackButton
Обсуждение
Да, если кнопка назад скрыта, когда этот элемент навигации является верхним элементом; иначе НЕТ. элемент; в противном случае - НЕТ. Значение по умолчанию НЕТ.
Доступность
Доступно в iPhone OS 2.0 и более поздних версиях.