¿Cómo deshabilitar el botón de edición que aparece en la sección más de un UITabBarController?

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

  •  05-07-2019
  •  | 
  •  

Pregunta

En mi aplicación (basada en la plantilla XCode de la barra de pestañas) utilizo un UITabBarController para mostrar una lista de las diferentes secciones de la aplicación a las que el usuario puede acceder.

De forma predeterminada, el UITabBarController muestra un botón 'Más' en la barra de pestañas cuando hay más de 5 elementos. Además, le permite al usuario seleccionar los elementos que desea que estén visibles en la barra de pestañas.

Actualmente no puedo implementar guardar y cargar el estado del controlador de la barra de pestañas, por lo que quiero desactivar el botón "Editar".

¿Hay alguna forma de desactivar / ocultar el botón de la barra 'Editar' que aparece en el controlador de navegación 'Más' de UITabBarController?

Lo intenté:

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

y

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

pero no parecen funcionar.

¿Fue útil?

Solución

Conviértase en un delegado de moreNavigationController (es un UINavigationController) y agregue esto:

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

Ahora no aparecerá. La clave a tener en cuenta es que el botón Editar aparece no después de la creación del controlador, sino antes de mostrar la vista, y debemos sentarnos en silencio hasta ese momento y luego, cuando el controlador vaya a mostrar la pantalla, eliminaremos el botón para que No tendrá la oportunidad de crearlo de nuevo. :)

Otros consejos

customizableViewControllers es una matriz; configúrelo en la matriz vacía para deshabilitar toda la edición.

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

Lo he intentado y aquí hay un ejemplo.

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

para eliminar la " Editar " Botón

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

En su AppDelegate.h

@interface TestAppDelegate : NSObject <UIApplicationDelegate, UITabBarControllerDelegate, UINavigationControllerDelegate>

corrígeme si me equivoco.

Pude hacer que esto funcionara con el siguiente código. Creé un CustomTabViewController y luego modifiqué la Identidad de Clase de mi Controlador de la Barra de Pestañas en Interface Builder para usar esta clase personalizada. Aquí está el código que usa (contenido del archivo .h y .m). La clave es establecer la propiedad en nil, lo que hace que no se muestre el botón Editar. Para más detalles, consulte: http://developer.apple.com/library/ios/documentation/uikit/reference/UITabBarController_Class/Reference.html#//apple_ref/occ/instp/UITabBarController/customizableViewControllers " Si la matriz está vacía o el valor de esta propiedad es nulo, la barra de pestañas no permite reorganizar ningún elemento. "

#import <UIKit/UIKit.h>

@interface CustomTabBarController : UITabBarController {

}
@end

#import "CustomTabBarController.h"


@implementation CustomTabBarController

- (void)viewDidLoad
{
    self.customizableViewControllers = nil;
    [super viewDidLoad];
}   

@end

Esto se puede lograr como tal. No es la solución más elegante, pero funciona & # 8482 ;.

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

Simplemente agregue una línea de código en el método del ciclo de vida, es decir, la aplicación terminó de iniciarse:

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

}

@ m4rkk & amp; @lan terrell ese código no funciona.

No pude obtenerlo, así que simplemente deshabilité la barra de navegación por completo.

tabBarController.moreNavigationController.navigationBar.hidden = YES;

No sé sobre iOS4, pero importa si pones el código en viewDidLoad vs viewWillAppear .

Es decir, esto funcionará.

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

Si usa NavigationController como su 1st ViewController y presiona uno de los botones para ingresar a UITabBarController. Luego, aparte de agregar el código a continuación,

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

debe agregar esta " instrucción if " para evitar que aparezca el botón de edición cuando haga clic por primera vez en el 5º ViewControllers y más arriba.

if (self.selectedIndex >= 4) 
{
    self.customizableViewControllers = nil;
}

En los que trabajan con Xcode mayor que 4.0 (estoy trabajando en Xcode 4.2 para Snow Leopard):

Compruebe en primer lugar dónde cambia la matriz de vistas la última vez. Creo que no importa en qué método configures tu personalizableView-Array en nil. La descripción de las manzanas dice:

  

Importante: la adición o eliminación de controladores de vista en la interfaz de la barra de pestañas también restablece el conjunto de controladores de vista personalizables al valor predeterminado, lo que permite que todos los controladores de vista se vuelvan a personalizar. Por lo tanto, si realiza modificaciones a la propiedad viewControllers (ya sea directamente o llamando a setViewControllers: animated: method) y aún desea limitar los controladores de vista personalizables, también debe actualizar la matriz de objetos en la propiedad personalizableViewControllers.

Funcionó para mí, así que por favor pruébalo. Encontré esta descripción aquí: enlace a la descripción en developer.apple.com en el capítulo " Evitar la personalización de las pestañas " ;.

Un iPhone 6 Plus permitirá más botones en la barra de pestañas en modo horizontal que en vertical. Desafortunadamente, esto significa que restablece la matriz personalizableViewControllers cada vez que se gira el dispositivo, y ninguna de las respuestas aquí funcionaron para mí.

Ya contaba con mi propia subclase UITabBarController y la anulación de los métodos de establecimiento y obtención para los controladores de vista personalizables era la única forma confiable de eliminar el botón Editar de la pantalla Más:

- (NSArray *)customizableViewControllers
{
    return nil;
}

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

Esta es una adición tardía, pero creo que es una contribución útil. La respuesta de Aleks N puede crear una situación en la que se elimina el rightBarButtonItem para cada controlador de vista en la pestaña " Más pestaña " (como mencionó Bao Lei). Me gustaría recomendar el uso del Código de Bao Lei, pero con la diferencia de implementarlo, el método de delegado didShowViewController .

Como su código existe ahora, los usuarios que pulsan " Más " La pestaña para volver a la tabla base UIMoreViewController puede hacer que rightBarButtonItem's que pertenecen a otros viewControllers se establezca en 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;
    }
}

La distinción es pequeña pero me tomó mucho tiempo encontrar este error.

La respuesta de Aleks N funciona, pero me gustaría modificar un poco

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

Dado que este método de delegado se invoca cada vez que un controlador de vista se empuja o aparece en esta pila de vistas. Cuando presionamos otras vistas en este " Más " controlador de vista, no queremos hacer esto.

La única solución que funcionó para mí

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

Probé la mayoría de estas soluciones y me encontré con un problema en el que el botón de edición volvería al girar el dispositivo. La rotación se restablecería al primer controlador de vista, luego, cuando volví al controlador de más vista, el botón de edición estaba allí. La mejor solución era convertirse en UITabBarControllerDelegate y establecer el botón de la barra derecha en nulo cada vez que más controlador de vista se convirtió en el controlador de vista seleccionado. Esto está funcionando para 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
        }
    }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top