Come disabilitare il pulsante di modifica che appare nella sezione più di un UITabBarController?

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

  •  05-07-2019
  •  | 
  •  

Domanda

Nella mia applicazione (basata sul modello XCode dell'applicazione della barra delle schede) utilizzo un UITabBarController per visualizzare un elenco di diverse sezioni dell'applicazione a cui l'utente può accedere.

Per impostazione predefinita, UITabBarController visualizza un pulsante "Altro" nella barra delle schede quando sono presenti più di 5 elementi. Inoltre, consente all'utente di selezionare gli elementi che desidera siano visibili nella barra delle schede.

Attualmente non riesco a implementare il salvataggio e il caricamento dello stato del controller della barra delle schede, quindi desidero disabilitare il pulsante "Modifica".

Esiste un modo per disabilitare / nascondere il pulsante della barra "Modifica" che appare sul controller di navigazione "Altro" di UITabBarController?

Ho provato:

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

e

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

ma non sembrano funzionare.

È stato utile?

Soluzione

Diventa un delegato di moreNavigationController (è un UINavigationController) e aggiungi questo:

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

Ora non apparirà. La cosa fondamentale da considerare è che il pulsante Modifica non appare dopo la creazione del controller, ma prima di visualizzare la vista, e dovremmo rimanere in silenzio fino a quel momento e poi, quando il controller mostrerà lo schermo, elimineremo il pulsante in modo che non avrà la possibilità di crearlo di nuovo. :)

Altri suggerimenti

customizableViewControllers è un array; impostarlo su un array vuoto per disabilitare tutte le modifiche.

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

ho provato ed ecco un esempio.

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

per rimuovere " Modifica " Pulsante

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

In AppDelegate.h

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

correggimi se sbaglio.

Sono stato in grado di farlo funzionare con il seguente codice. Ho creato un CustomTabViewController e quindi modificato l'identità di classe del mio controller della barra delle schede in Interface Builder per utilizzare questa classe personalizzata. Ecco il codice che utilizza (contenuto del file .h e .m). La chiave sta impostando la proprietà su zero, il che rende impossibile visualizzare il pulsante Modifica. Per i dettagli, consultare: http://developer.apple.com/library/ios/documentation/uikit/reference/UITabBarController_Class/Reference/Reference.html#//apple_ref/occ/instp/UITabBarController/customizableViewControllers " Se l'array è vuoto o il valore di questa proprietà è zero, la barra delle schede non consente di riorganizzare alcun elemento. "

#import <UIKit/UIKit.h>

@interface CustomTabBarController : UITabBarController {

}
@end

#import "CustomTabBarController.h"


@implementation CustomTabBarController

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

@end

Questo può essere ottenuto in questo modo. Non è la soluzione più elegante, ma funziona ™.

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

È sufficiente aggiungere una riga di codice nel metodo del ciclo di vita, ovvero l'applicazione ha terminato l'avvio:

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

}

@ m4rkk & amp; @lan terrell quel codice non funziona.

Non sono riuscito a ottenerlo, quindi disabilito del tutto la barra di navigazione.

tabBarController.moreNavigationController.navigationBar.hidden = YES;

Non conosco iOS4, ma è importante se inserisci il codice in viewDidLoad vs viewWillAppear .

Cioè, funzionerà.

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

Se si utilizza NavigationController come primo ViewController e si preme uno dei pulsanti per accedere a UITabBarController. Quindi oltre ad aggiungere il codice qui sotto,

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

devi aggiungere questa istruzione "quot" if per evitare che il pulsante Modifica venga visualizzato quando si fa clic per la prima volta sul 5 ° ViewController e sopra.

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

Per quelli che lavorano con Xcode maggiore di 4.0 (sto lavorando su Xcode 4.2 per Snow Leopard):

Verifica dapprima dove hai cambiato l'array di viste l'ultima volta. Penso che non importa in quale metodo hai impostato il tuo personalizzabile Vista-array su zero. La descrizione delle mele dice:

  

Importante: l'aggiunta o la rimozione di controller di visualizzazione nell'interfaccia della barra delle schede reimposta l'array di controller di visualizzazione personalizzabili sul valore predefinito, consentendo di personalizzare nuovamente tutti i controller di visualizzazione. Pertanto, se si apportano modifiche alla proprietà viewControllers (direttamente o chiamando il metodo setViewControllers: animato:) e si desidera ancora limitare i controller di visualizzazione personalizzabili, è necessario aggiornare anche l'array di oggetti nella proprietà customizableViewControllers.

Ha funzionato per me, quindi per favore provalo. Ho trovato questa descrizione qui: link alla descrizione su developer.apple.com al capitolo " Prevenzione della personalizzazione delle schede " ;.

Un iPhone 6 Plus consentirà più pulsanti sulla barra delle schede in modalità orizzontale che in verticale. Sfortunatamente questo significa che reimposta l'array personalizzabile ViewControllers ogni volta che il dispositivo viene ruotato e nessuna delle risposte qui ha funzionato per me.

Avevo già la mia sottoclasse UITabBarController e l'override dei metodi setter e getter per i personalizzabili ViewController era l'unico modo affidabile per rimuovere il pulsante Modifica dalla schermata Altro:

- (NSArray *)customizableViewControllers
{
    return nil;
}

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

Questa è un'aggiunta tardiva ma penso che sia un contributo utile. La risposta di Aleks N può creare una situazione in cui rightBarButtonItem viene rimosso per ogni controller di visualizzazione nella scheda " More Tab " (come menzionato Bao Lei). Vorrei raccomandare di usare il Codice Bao Lei, ma con la differenza di impiantarlo il metodo delegato didShowViewController .

Poiché il suo codice esiste ora, gli utenti toccano " Più " per tornare alla tabella di base UIMoreViewController può causare l'impostazione di rightBarButtonItem appartenente ad altri viewController su zero.

- (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 distinzione è piccola ma mi ci è voluto molto tempo per trovare questo bug.

La risposta di Aleks N funziona, ma mi piacerebbe modificare un po '

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

Dato che questo metodo delegato viene chiamato ogni volta che un controller di visualizzazione viene inviato o visualizzato su questo stack di viste. Quando stiamo spingendo altre opinioni su questo " Più " visualizza controller, non vogliamo farlo.

L'unica soluzione che ha funzionato per me

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

Ho provato la maggior parte di queste soluzioni e stavo riscontrando un problema in cui il pulsante di modifica tornava quando si ruotava il dispositivo. La rotazione si ripristinava al primo controller di visualizzazione, quindi quando tornavo al controller di visualizzazione più, il pulsante di modifica era lì. La soluzione migliore era quella di diventare il UITabBarControllerDelegate e impostare il pulsante della barra destra su zero ogni volta che più controller di visualizzazione diventava il controller di visualizzazione selezionato. Funziona con 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
        }
    }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top