Как я могу динамически скрыть кнопку от вида? - PullRequest
36 голосов
/ 10 ноября 2008

Я хотел бы динамически скрыть кнопку в одном из моих представлений в зависимости от определенного условия.

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

У меня есть ссылка на кнопку через IBOutlet, но я не уверен, как двигаться дальше отсюда. Для справки: это экземпляр UIBarButtonItem.

Ответы [ 12 ]

54 голосов
/ 10 ноября 2008

Если вы пытаетесь скрыть UIBarButtonItem, вам фактически придется изменить содержимое родительской панели. Если это UIToolBar, вам нужно установить массив элементов панели в массив, который не содержит ваш элемент.

NSMutableArray     *items = [[myToolbar.items mutableCopy] autorelease];
[items removeObject: myButton];
myToolbar.items = items;
20 голосов
/ 31 июля 2009

Установить для бара значение ноль.

Например:

self.navigationItem.leftBarButtonItem = nil;
11 голосов
/ 15 апреля 2010

Итак, я попробовал выигрышный подход Бена, но в итоге я обнаружил, что это неправильно для моих целей - хотя я уверен, что это зависит от того, что вы пытаетесь сделать. Я пытался показать кнопку панели навигации только при определенных условиях, а затем скрыть ее, как только условие больше не будет выполнено (в моем случае это кнопка «Готово», используемая для скрытия клавиатуры, связанной с UITextView. Она должна быть только отображается, когда пользователь печатает в текстовом представлении). Мои шаги были следующие:

  1. Я добавил UIBarButtonItem как недвижимость в моем UIViewController учебный класс. Я создаю это в Метод initWithNibName.

  2. Я назначил свойство UIBarButtonItem как rightBarButtonItem в навигационной панели как как только пользователь начинает вводить просмотр текста.

  3. Я установил свойство UIBarButtonItem ноль, когда пользователь закончил печатать.

Это работает как шарм. Я добавляю несколько примеров кода ниже.

Сначала создайте экземпляр кнопки в моем методе инициализации контроллера вида:

barButtonItemDone = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(done:)];

Затем я установил ее в качестве правой кнопки в методе делегата, который вызывается, как только пользователь начинает редактировать текстовое представление:

self.navigationItem.rightBarButtonItem=[self barButtonItemDone];

Наконец, когда нажата сама кнопка, вызывается метод с именем done, и я просто устанавливаю rightBarButtonItem равным nil внутри этого метода:

self.navigationItem.rightBarButtonItem=nil;
10 голосов
/ 23 августа 2010

Если все, что вы пытаетесь скрыть - это кнопка «Назад» на панели навигации, есть более простой способ:

self.navigationItem.hidesBackButton = YES;

Цитата из документации разработчика:

hidesBackButton

Логическое значение, определяющее, является ли кнопка возврата скрытой.

@ свойство (неатомное, присваивать) BOOL hidesBackButton

Обсуждение

ДА, если кнопка возврата скрыта, когда этот элемент навигации находится сверху вещь; в противном случае НЕТ. Значение по умолчанию НЕТ.

Наличие

Доступно в iPhone OS 2.0 и более поздних версиях.

7 голосов
/ 28 ноября 2011

Это немного хак, но в моем случае это работает (и правильно обрабатывает динамический интервал):

Чтобы скрыть:

myButton.width = 0.1;

Показать:

myButton.width = 0.0;

Ширина 0.0 - это «автоматическая ширина», а при ширине 0.1 кнопка полностью исчезает (даже не «полоска» кнопки, хотя я не пробовал это на дисплее сетчатки).

5 голосов
/ 21 января 2012

Еще одно хакерское решение:

myButton.customView = [[UIView alloc] init];
2 голосов
/ 11 декабря 2013

Этот ответ относится к текстовым UIBarButtonItems, однако та же концепция может быть применена и к другим типам кнопок. Обратите внимание, что это позволит скрыть и , чтобы показать элемент снова. Многие из приведенных выше ответов (например, те, которые устанавливают значение кнопки на ноль, не позволяют повторно отображать кнопку, если это необходимо).

TL; DR:

if (shouldShowMyBarButtonItem) {
    self.myBarButtonItem.title = nil;
    self.myBarButtonItem.action = nil;
} else if (!shouldShowMyBarButtonItem) {
    self.myBarButtonItem.title = @"Title";
    self.myBarButtonItem.action = @selector(mySelector:);
}

Длинная версия:

UIBarButtonItem, который я пытался скрыть, находится на панели UIToolbar, а не на UINavigationBar, поэтому все предложения, которые обращаются к левому (или правому) свойству barButtonItem элемента навигации, не работают для меня. Также, как указано выше, я хотел бы снова показать кнопку, когда обстоятельства изменятся.

Предложение Майкла оказалось наиболее близким к работе, однако, по крайней мере, с iOS 7 все еще оставалась небольшая полоска очень отображаемой кнопки, которую можно было нажать. В моем приложении нажатие на элемент, когда он не должен быть доступен, было недопустимым. Приведенный выше код скрывает и, что особенно важно, деактивирует кнопку.

Я вызываю приведенный выше код в частном методе обновления, который вызывается, когда происходит пользовательское событие.

2 голосов
/ 15 октября 2010

Лучшее решение для этого - менее технический. Все, что вам нужно сделать, это создать обычную панель навигации (вверху) или панель инструментов (внизу), но без дополнительной кнопки. Затем создайте другую идентичную, но более короткую полосу, которую затем поместите в нужную часть дополнительной кнопки, и создайте дополнительную кнопку на этой второй более короткой панели.

Теперь вы можете звонить hidden = YES на весь дополнительный бар.

Брусья плавно пересекаются для меня, ваш пробег может отличаться.

1 голос
/ 30 ноября 2011

Если вы добавляете UIButton к UIBarButtonItem, а не просто используете UIBarButtonItem.

Затем можно назначить UIButton.hidden на TRUE или YES, и он (и UIBarButtonItem) не будет видимым или активным.

Надеюсь, это поможет.

1 голос
/ 03 сентября 2011

Ответ Бена технически верен, хотя, когда я пробую его на своем пользовательском UIToolbar, элементы растягиваются так, как мне не нравится, потому что я использую элементы UIBarButtonSystemItemF FlexibleSpace.

Если вы хотите, чтобы другие ваши предметы оставались на том же месте, вам придется либо установить гибкие пробелы на фиксированные, либо попробовать то, что я сделал:

[filterBarButton.customView setHidden:YES];

примечание: это работает, только если ваш UIBarButtonItem использует пользовательские представления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...