Как отключить кнопку редактирования, которая появляется в разделе «Дополнительно» UITabBarController?

StackOverflow https://stackoverflow.com/questions/825066

  •  05-07-2019
  •  | 
  •  

Вопрос

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

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

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

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

Я пытался:

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

и

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

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

Это было полезно?

Решение

Стать делегатом 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;
}

Теперь оно не появится.Главное, что нужно учитывать, это то, что кнопка «Редактировать» появляется не после создания контроллера, а перед отображением вида, и до этого момента мы должны молча сидеть, а затем, когда контроллер будет отображать экран, мы выбьем кнопку, чтобы у него не будет возможности создать его снова.:)

Другие советы

customizableViewControllers представляет собой массив;установите его в пустой массив, чтобы отключить любое редактирование.

tabBarController.customizableViewControllers = [NSArray arrayWithObjects:nil];
tabBarController .customizableViewControllers = nil;

я попробовал и вот пример.

В AppDelegate.m

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    

    // Override point for customization after application launch.

    // Add the tab bar controller's 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>

поправьте меня если я ошибаюсь.

Мне удалось заставить это работать с помощью следующего кода.Я создал CustomTabViewController а затем изменил идентификатор класса моего контроллера панели вкладок в Interface Builder, чтобы использовать этот пользовательский класс.Вот код, который он использует (содержимое файлов .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

Этого можно добиться таким образом.Это не самое элегантное решение, но оно работает™.

// 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;   
}

Просто добавьте строку кода в метод жизненного цикла, т.е.приложение завершило запуск:

- (void)applicationDidFinishLaunching:(UIApplication *)application
{ 
    tabBarController.customizableViewControllers=nil;

}

@m4rkk и @lan terrell, этот код не работает.

Мне не удалось его получить, поэтому я просто отключил панель навигации.

tabBarController.moreNavigationController.navigationBar.hidden = YES;

Не знаю, как насчет iOS4, но это имеет значение, если вы вставите код viewDidLoad против viewWillAppear.

Т.е., это сработает.

- (void)viewWillAppear:(BOOL)animated
{
self.customizableViewControllers = nil;
}

Если вы используете NavigationController в качестве первого 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;
}

В тех, кто работает с Xcode выше 4.0 (я работаю над Xcode 4.2 для Snow Leopard):

Проверьте сначала, где вы меняли массив представлений в последний раз.Я думаю, не имеет значения, каким методом вы устанавливаете для настраиваемого массива View-Array значение ноль.В описании яблок указано:

Важный:Добавление или удаление контроллеров представления в интерфейсе панели вкладок также сбрасывает массив настраиваемых контроллеров представления до значения по умолчанию, что позволяет снова настроить все контроллеры представления.Поэтому, если вы вносите изменения в свойство viewControllers (напрямую или путем вызова метода setViewControllers:animated:метод) и по-прежнему хотите ограничить настраиваемые контроллеры представления, вам также необходимо обновить массив объектов в свойстве customizableViewControllers.

У меня это сработало, поэтому, пожалуйста, попробуйте.Я нашел это описание здесь: ссылка на описание на сайте Developer.apple.com в главе «Предотвращение настройки вкладок».

iPhone 6 Plus позволит использовать больше кнопок на панели вкладок в альбомном режиме, чем в портретном.К сожалению, это означает, что он сбрасывает массив customizableViewControllers при каждом повороте устройства, и ни один из ответов здесь не помог мне.

У меня уже был собственный подкласс UITabBarController, и переопределение методов установки и получения для customizableViewControllers было единственным надежным способом удалить кнопку «Редактировать» с экрана «Дополнительно»:

- (NSArray *)customizableViewControllers
{
    return nil;
}

- (void)setCustomizableViewControllers:(NSArray*)controllers
{
    //do nothing
}

Это последнее добавление, но я думаю, что это полезный вклад.Ответ Алекса Н. может создать ситуацию, когда rightBarButtonItem удаляется для каждого контроллера представления на вкладке «Дополнительно» (как упоминал Бао Лэй).Я хотел бы порекомендовать использовать Кодекс Бао Лея, но с той разницей, что его внедрение дидшоувиевконтроллер метод делегата.

Поскольку его код существует сейчас, пользователи нажимают вкладку «Еще», чтобы вернуться в базу. UIMoreViewController таблица может вызвать rightBarButtonItem принадлежащий другим viewControllers, должен быть установлен в ноль.

- (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;
    }
}

Разница невелика, но мне потребовалось немало времени, чтобы найти эту ошибку.

Ответ Алекса Н. работает, но я бы хотел немного изменить

- (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;
    }
}

Поскольку этот метод делегата вызывается каждый раз, когда контроллер представления помещается или извлекается из этого стека представления.Когда мы помещаем другие представления в этот контроллер представления «Больше», мы не хотим этого делать.

Единственное решение, которое сработало для меня

self.moreNavigationController.navigationBar.topItem?.rightBarButtonItem?.title = ""
self.moreNavigationController.navigationBar.topItem?.rightBarButtonItem?.isEnabled = false

Я попробовал большинство этих решений и столкнулся с проблемой, из-за которой кнопка редактирования возвращалась при вращении устройства.Вращение вернется к первому контроллеру представления, а затем, когда я вернусь к большему контроллеру представления, кнопка редактирования будет там.Лучшим решением было стать UITabBarControllerDelegate и установите правую кнопку панели на ноль в любое время, когда контроллер представления станет выбранным контроллером представления.Это работает для iOS 11-12.

final class DashboardController: UITabBarController {

    override func viewDidLoad() {
        super.viewDidLoad()

        delegate = self
    }
}

extension DashboardController: UITabBarControllerDelegate {
    func tabBarController(_ tabBarController: UITabBarController, didSelect viewController: UIViewController) {
        if viewController == moreNavigationController {
            moreNavigationController.navigationBar.topItem?.rightBarButtonItem = nil
        }
    }
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top