Comment désactiver le bouton d'édition qui apparaît dans la section more d'un UITabBarController?

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

  •  05-07-2019
  •  | 
  •  

Question

Dans mon application (basée sur le modèle XCode de l'application Barre d'onglets), j'utilise un UITabBarController pour afficher une liste des différentes sections de l'application auxquelles l'utilisateur peut accéder.

Par défaut, UITabBarController affiche un bouton "Plus" dans la barre d'onglets lorsqu'il y a plus de 5 éléments. En outre, il permet à l'utilisateur de sélectionner les éléments qu'il souhaite voir visibles dans la barre d'onglets.

Actuellement, je ne peux pas mettre en œuvre l'enregistrement et le chargement de l'état du contrôleur de la barre d'onglets. Je souhaite donc désactiver le bouton "Modifier".

Existe-t-il un moyen de désactiver / masquer le bouton de la barre "Éditer" qui apparaît sur le contrôleur de navigation "Plus" de UITabBarController?

j'ai essayé:

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

et

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

mais ils ne semblent pas fonctionner.

Était-ce utile?

La solution

Devenez un délégué de moreNavigationController (il s'agit d'un UINavigationController) et ajoutez ceci:

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

Maintenant, il n'apparaîtra pas. L’important est que le bouton Modifier n'apparaisse pas après la création du contrôleur, mais avant d'afficher la vue. Nous devons rester silencieux jusqu'à ce moment-là, puis, lorsque le contrôleur affichera l'écran, nous le désactiverons de sorte que il n'aura pas la chance de le recréer. :)

Autres conseils

customizableViewControllers est un tableau. définissez-le sur le tableau vide pour désactiver toutes les modifications.

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

j'ai essayé et voici un exemple.

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

pour supprimer le " Modifier " Bouton

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

Dans votre AppDelegate.h

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

corrigez-moi si je me trompe.

J'ai pu faire fonctionner ce code avec le code suivant. J'ai créé un CustomTabViewController , puis modifié l'identité de la classe de mon contrôleur de barre d'onglets dans Interface Builder pour utiliser cette classe personnalisée. Voici le code qu'il utilise (contenu du fichier .h et .m). La clé définit la propriété sur nil, ce qui empêche l'affichage du bouton Modifier. Pour plus de détails, voir: http://developer.apple.com/library/ios/documentation/uikit/reference/UITabBarController_Class/Reference/Reference.html#//apple_ref/occ/instp/UITabBarController/customizableViewControllers "Si le tableau est vide ou si la valeur de cette propriété est nulle, la barre d'onglets ne permet pas de réorganiser les éléments."

#import <UIKit/UIKit.h>

@interface CustomTabBarController : UITabBarController {

}
@end

#import "CustomTabBarController.h"


@implementation CustomTabBarController

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

@end

Ceci peut être réalisé comme tel. Ce n’est pas la solution la plus élégante, mais ça marche ™.

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

Ajoutez simplement une ligne de code dans la méthode du cycle de vie, c'est-à-dire que l'application a fini de se lancer:

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

}

@ m4rkk & amp; @lan Terrell, ce code ne fonctionne pas.

Je ne pouvais pas l'obtenir, alors je viens de désactiver complètement la barre de navigation.

tabBarController.moreNavigationController.navigationBar.hidden = YES;

Je ne connais pas iOS 4, mais il importe que vous insériez le code dans viewDidLoad et viewWillAppear .

C'est-à-dire que cela fonctionnera.

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

Si vous utilisez NavigationController en tant que 1er ViewController et que vous appuyez sur l'un des boutons pour accéder à UITabBarController. Ensuite, en plus d'ajouter le code ci-dessous,

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

vous devez ajouter ceci " if statement " pour éviter que le bouton d'édition ne s'affiche lorsque vous cliquez pour la première fois sur le 5ème ViewControllers et au-dessus.

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

Sur ceux qui travaillent avec Xcode supérieur à 4.0 (je travaille sur Xcode 4.2 pour Snow Leopard):

Vérifiez tout d’abord où modifiez-vous le tableau de vues la dernière fois. Je pense que la méthode dans laquelle vous définissez votre tableau personnalisable ViewView sur nil importe peu. Description de la pomme dit:

  

Important: L'ajout ou la suppression de contrôleurs de vue dans votre interface de barre de tabulation réinitialise également le tableau de contrôleurs de vue personnalisables à la valeur par défaut, ce qui permet de personnaliser à nouveau tous les contrôleurs de vue. Par conséquent, si vous apportez des modifications à la propriété viewControllers (directement ou en appelant la méthode setViewControllers: animated:) et que vous souhaitez toujours limiter les contrôleurs de vue personnalisables, vous devez également mettre à jour le tableau d'objets de la propriété customizableViewControllers.

Cela a fonctionné pour moi, alors essayez-le. J'ai trouvé cette description ici: Lien vers la description sur developer.apple.com au chapitre "Empêcher la personnalisation des onglets".

Un iPhone 6 Plus autorisera davantage de boutons sur la barre d'onglets en mode paysage qu'en mode portrait. Malheureusement, cela signifie que le tableau personnalisable ViewControllers est réinitialisé chaque fois que le périphérique est pivoté, et aucune des réponses fournies ici ne fonctionne pour moi.

J'avais déjà ma propre sous-classe UITabBarController et redéfinir les méthodes de définition et d'acquisition pour customizableViewControllers était le seul moyen fiable de supprimer le bouton Modifier de l'écran Plus:

- (NSArray *)customizableViewControllers
{
    return nil;
}

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

Ceci est un ajout tardif mais je pense que c'est une contribution utile. La réponse d'Aleks N peut créer une situation dans laquelle rightBarButtonItem est supprimé pour chaque contrôleur de vue sous l'onglet "Plus d'onglets". (comme mentionné par Bao Lei). Je voudrais recommander l'utilisation du code de Bao Lei, mais à la différence de son implémentation, utilisez la méthode de délégation didShowViewController .

Comme son code existe maintenant, les utilisateurs tapent sur le bouton "Plus". Un onglet pour revenir à la table UIMoreViewController de base peut entraîner la définition de rightBarButtonItem appartenant à d'autres 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;
    }
}

La distinction est petite mais il m'a fallu beaucoup de temps pour trouver ce bug.

La réponse d'Aleks N fonctionne, mais j'aimerais modifier un peu

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

Puisque cette méthode de délégation est appelée à chaque fois qu’un contrôleur de vue est poussé ou sauté sur cette pile de vues. Lorsque nous plaçons d'autres points de vue sur ce " More " contrôleur de vue, nous ne voulons pas faire cela.

La seule solution qui a fonctionné pour moi

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

J'ai essayé la plupart de ces solutions et je rencontrais un problème qui entraînait le retour du bouton d'édition lors de la rotation de l'appareil. La rotation revenait au premier contrôleur de vue, puis lorsque je revenais au contrôleur de vue supplémentaire, le bouton Modifier était là. La meilleure solution consistait à devenir UITabBarControllerDelegate et à définir le bouton droit de la barre sur nil à chaque fois que plus le contrôleur de vue devenait le contrôleur de vue sélectionné. Ceci fonctionne pour 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
        }
    }
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top