Как отключить кнопку редактирования, которая отображается в более общем разделе UITabBarController?
В моем приложении (на основе шаблона XCode на панели табуляции) я использую UITabBarController для отображения списка различных разделов приложения, к которым пользователь может получить доступ.
По умолчанию UITabBarController отображает кнопку "Дополнительно" на панели вкладок, когда имеется более 5 элементов. Кроме того, он позволяет пользователю выбирать элементы, которые он хочет видеть на панели вкладок.
В настоящее время я не могу реализовать сохранение и загрузку состояния контроллера панели вкладок, поэтому я хочу отключить кнопку "Изменить".
Есть ли способ отключить/скрыть кнопку "Редактировать", которая появляется на контроллере навигации "Больше" UITabBarController?
Я пробовал:
tabBarController.moreNavigationController.navigationBar.topItem.rightBarButtonItem = nil;
и
tabBarController.moreNavigationController.navigationBar.topItem.rightBarButtonItem.enabled = NO;
но они, похоже, не работают.
Ответы
Ответ 1
Стать делегатом moreNavigationController
(это UINavigationController) и добавить это:
- (void)navigationController:(UINavigationController *)navigationController
willShowViewController:(UIViewController *)viewController
animated:(BOOL)animated {
UINavigationBar *morenavbar = navigationController.navigationBar;
UINavigationItem *morenavitem = morenavbar.topItem;
/* We don't need Edit button in More screen. */
morenavitem.rightBarButtonItem = nil;
}
Теперь он не появится. Главное, чтобы рассмотреть, что кнопка "Редактировать" появляется не после создания контроллера, но перед отображением представления, и мы должны сидеть молча до этого момента, а затем, когда контроллер будет отображать экран, мы будем выбивать кнопку так, чтобы у него не будет возможности создать его снова.:)
Ответ 2
customizableViewControllers
- массив; установите его в пустой массив, чтобы отключить все редактирование.
tabBarController.customizableViewControllers = [NSArray arrayWithObjects:nil];
Ответ 3
tabBarController .customizableViewControllers = nil;
Ответ 4
Я попробовал и вот пример.
В AppDelegate.m
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
// Override point for customization after application launch.
// Add the tab bar controller view to the window and display.
[self.window addSubview:tabBarController.view];
[self.window makeKeyAndVisible];
//setting delegate to disable edit button in more.
tabBarController.moreNavigationController.delegate = self;
return YES;
}
чтобы удалить кнопку "Изменить"
- (void)navigationController:(UINavigationController *)navigationController willShowViewController:(UIViewController *)viewController animated:(BOOL)animated {
UINavigationBar *morenavbar = navigationController.navigationBar;
UINavigationItem *morenavitem = morenavbar.topItem;
/* We don't need Edit button in More screen. */
morenavitem.rightBarButtonItem = nil;
}
В приложении AppDelegate.h
@interface TestAppDelegate : NSObject <UIApplicationDelegate, UITabBarControllerDelegate, UINavigationControllerDelegate>
исправьте меня, если я ошибаюсь.
Ответ 5
Мне удалось получить эту работу со следующим кодом. Я создал CustomTabViewController
, а затем изменил свой идентификатор класса панели управления таблицами в построителе интерфейса, чтобы использовать этот настраиваемый класс. Вот код, который он использует (.h и .m содержимое файла). Ключ устанавливает свойство nil, что приводит к тому, что кнопка "Редактировать" не отображается. Подробнее см.: http://developer.apple.com/library/ios/documentation/uikit/reference/UITabBarController_Class/Reference/Reference.html#//apple_ref/occ/instp/UITabBarController/customizableViewControllers
"Если массив пуст или значение этого свойства равно нулю, панель вкладок не позволяет переупорядочивать какие-либо элементы".
#import <UIKit/UIKit.h>
@interface CustomTabBarController : UITabBarController {
}
@end
#import "CustomTabBarController.h"
@implementation CustomTabBarController
- (void)viewDidLoad
{
self.customizableViewControllers = nil;
[super viewDidLoad];
}
@end
Ответ 6
@m4rkk и @lan terrell, что код не работает.
Я не смог его получить, поэтому полностью отключил навигационную панель.
tabBarController.moreNavigationController.navigationBar.hidden = YES;
Ответ 7
Это может быть достигнуто как таковое. Это не самое элегантное решение, но It Works ™.
// Optional UITabBarControllerDelegate method
- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController {
[self performSelector:@selector(removeEdit) withObject:nil afterDelay:.0001];
}
- (void)removeEdit
{
tabBarController.moreNavigationController.navigationBar.topItem.rightBarButtonItem = nil;
}
Ответ 8
Я не знаю об iOS4, но имеет значение, если вы поместите код в viewDidLoad
vs viewWillAppear
.
Т.е. это будет работать.
- (void)viewWillAppear:(BOOL)animated
{
self.customizableViewControllers = nil;
}
Ответ 9
Просто добавьте строку кода в метод жизненного цикла, то есть приложение закончило запуск:
- (void)applicationDidFinishLaunching:(UIApplication *)application
{
tabBarController.customizableViewControllers=nil;
}
Ответ 10
Если вы используете NavigationController в качестве 1-го ViewController и нажмите одну из кнопок, чтобы ввести UITabBarController. Затем, помимо добавления кода ниже,
- (void)navigationController:(UINavigationController *)navigationController
willShowViewController:(UIViewController *)viewController
animated:(BOOL)animated
{
UINavigationBar *morenavbar = navigationController.navigationBar;
UINavigationItem *morenavitem = morenavbar.topItem;
/* We don't need Edit button in More screen. */
morenavitem.rightBarButtonItem = nil;
}
вам нужно добавить этот оператор "if", чтобы избежать нажатия кнопки редактирования, когда вы сначала нажимаете 5-ые ViewControllers и выше.
if (self.selectedIndex >= 4)
{
self.customizableViewControllers = nil;
}
Ответ 11
Ответ Aleks N работает, но я хотел бы немного изменить
- (void)navigationController:(UINavigationController *)navigationController
willShowViewController:(UIViewController *)viewController
animated:(BOOL)animated
{
if (navigationController.viewControllers.count == 1)
{
UINavigationBar *morenavbar = navigationController.navigationBar;
UINavigationItem *morenavitem = morenavbar.topItem;
/* We don't need Edit button in More screen. */
morenavitem.rightBarButtonItem = nil;
}
}
Так как этот метод делегата вызывается каждый раз, когда контроллер просмотра вытолкнут или вставлен в этот стек представлений. Когда мы выдвигаем другие представления на этот контроллер "Больше", мы не хотим этого делать.
Ответ 12
У тех, кто работает с Xcode больше 4.0 (я работаю над Xcode 4.2 для Snow Leopard):
Сначала проверьте, где вы изменяете массив просмотров в последний раз. Я думаю, что не имеет значения, в каком методе вы настраиваете свой настраиваемый массив-образ на ноль. Описание яблок гласит:
Важно. Добавление или удаление контроллеров представлений в интерфейсе панели вкладок также сбрасывает массив настраиваемых контроллеров представления по умолчанию, позволяя снова настроить все контроллеры представлений. Поэтому, если вы вносите изменения в свойство viewControllers (прямо или вызываете метод setViewControllers: анимированный) и все еще хотите ограничить настраиваемые контроллеры представлений, вы также должны обновить массив объектов в свойстве customizableViewControllers.
Это сработало для меня, поэтому, пожалуйста, попробуйте.
Я нашел это описание здесь: ссылка на описание на developer.apple.com в главе "Предотвращение настройки вкладок".
Ответ 13
Это последнее дополнение, но я думаю, что это полезный вклад. Ответ Aleks N может создать ситуацию, когда rightBarButtonItem удаляется для каждого контроллера представления в разделе "Дополнительная вкладка" (как упоминал Бао Лей). Я хотел бы рекомендовать использовать Bao Lei Code, но с разницей в том, что он вложил в него метод делегирования didShowViewController.
Поскольку его код существует, пользователи, нажимая вкладку "Дополнительно", чтобы вернуться в базовую таблицу UIMoreViewController, могут иметь значение rightBarButtonItem, принадлежащее другим диспетчерам viewControllers, равным nil.
- (void)navigationController:(UINavigationController *)navigationController
didShowViewController:(UIViewController *)viewController
animated:(BOOL)animated
{
if (navigationController.viewControllers.count == 1)
{
UINavigationBar *morenavbar = navigationController.navigationBar;
UINavigationItem *morenavitem = morenavbar.topItem;
/* We don't need Edit button in More screen. */
morenavitem.rightBarButtonItem = nil;
}
}
Различие невелико, но мне понадобилось немало времени, чтобы найти эту ошибку.
Ответ 14
iPhone 6 Plus позволит больше кнопок на панели вкладок в ландшафтном режиме, чем на портрете. К сожалению, это означает, что он сбрасывает массив customizableViewControllers всякий раз, когда устройство поворачивается, и ни один из ответов здесь не работал у меня.
У меня уже был свой собственный подкласс UITabBarController и переопределение методов setter и getter для customizableViewControllers был единственным надежным способом удаления кнопки "Редактировать" на экране "Дополнительно":
- (NSArray *)customizableViewControllers
{
return nil;
}
- (void)setCustomizableViewControllers:(NSArray*)controllers
{
//do nothing
}
Ответ 15
Единственное решение, которое сработало для меня
self.moreNavigationController.navigationBar.topItem?.rightBarButtonItem?.title = ""
self.moreNavigationController.navigationBar.topItem?.rightBarButtonItem?.isEnabled = false