Подтвердить что ты не робот

Как отключить кнопку редактирования, которая отображается в более общем разделе UITabBarController?

В моем приложении (на основе шаблона XCode на панели табуляции) я использую UITabBarController для отображения списка различных разделов приложения, к которым пользователь может получить доступ.

По умолчанию UITabBarController отображает кнопку "Дополнительно" на панели вкладок, когда имеется более 5 элементов. Кроме того, он позволяет пользователю выбирать элементы, которые он хочет видеть на панели вкладок.

В настоящее время я не могу реализовать сохранение и загрузку состояния контроллера панели вкладок, поэтому я хочу отключить кнопку "Изменить".

Есть ли способ отключить/скрыть кнопку "Редактировать", которая появляется на контроллере навигации "Больше" UITabBarController?

Я пробовал:

tabBarController.moreNavigationController.navigationBar.topItem.rightBarButtonItem = nil;

и

tabBarController.moreNavigationController.navigationBar.topItem.rightBarButtonItem.enabled = NO;

но они, похоже, не работают.

4b9b3361

Ответ 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