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

dans mon application (basé sur la barre D'onglets application Xcode template) j'utilise un contrôleur UITabBarController pour afficher une liste des différentes sections de l'application auxquelles l'utilisateur peut accéder.

par défaut, le UITabBarController affiche un bouton 'Plus' dans la barre d'onglets lorsqu'il y a plus de 5 éléments. Aussi, il permet à l'utilisateur de sélectionner les éléments qu'il veulent être visible dans la barre d'onglet.

actuellement Je ne peux pas implémenter la sauvegarde et le chargement de l'état de la barre d'onglets contrôleur, donc je veux désactiver le bouton "Modifier".

y a-t-il un moyen de désactiver/cacher le bouton 'Edit' de la barre qui apparaît sur le contrôleur de navigation 'More' 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.

24
demandé sur Panagiotis Korros 2009-05-05 18:15:29
la source

16 ответов

Devenir délégué de moreNavigationController (c'est un UINavigationController) et ajouter 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. La chose clé à considérer est que le bouton D'édition apparaît pas après la création du contrôleur, mais avant d'afficher la vue, et nous devrions nous asseoir silencieusement jusqu'à ce moment-là et puis, lorsque le contrôleur va afficher l'écran, nous frapperons le bouton de sorte qu'il n'aura pas une chance de le créer à nouveau. :)

58
répondu Aleks N. 2012-04-17 20:39:07
la source

customizableViewControllers est un tableau; définissez-le au tableau vide pour désactiver toute édition.

tabBarController.customizableViewControllers = [NSArray arrayWithObjects:nil];
53
répondu Ian Terrell 2009-07-29 06:27:30
la source
tabBarController .customizableViewControllers = nil;
9
répondu m4rkk 2013-05-16 12:43:00
la source

j'ai essayé et voici un exemple.

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

pour supprimer le Bouton "Modifier"

    - (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.

6
répondu Jian Yu 2011-03-28 13:20:49
la source

j'ai pu obtenir ce fonctionnement avec le code suivant. J'ai créé un CustomTabViewController et ensuite modifié L'identité de classe de mon contrôleur de barre D'onglets dans Interface Builder pour utiliser cette classe personnalisée. Voici le code qu'il utilise (.h et .m contenu du fichier). La clé est de définir la propriété à zéro, ce qui fait que le bouton Edit n'est pas affiché. 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éarranger des éléments."

#import <UIKit/UIKit.h>

@interface CustomTabBarController : UITabBarController {

}
@end

#import "CustomTabBarController.h"


@implementation CustomTabBarController

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

@end
4
répondu Andre Oporto 2012-12-11 00:08:58
la source

Ceci peut être réalisé comme tel. Ce n'est pas la solution la plus élégante, mais Elle Fonctionne™.

// 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;   
}
3
répondu Logan Cautrell 2009-11-09 04:07:19
la source

il suffit D'ajouter une ligne de code dans la méthode du cycle de vie, c'est-à-dire que l'application a fini de lancer:

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

}
3
répondu Eshwar Chaitanya 2012-03-21 10:11:39
la source

@m4rkk & @ lan terrell ce code ne fonctionne pas.

Je n'ai pas pu l'obtenir alors j'ai tout simplement désactivé la barre de navigation.

tabBarController.moreNavigationController.navigationBar.hidden = YES;
3
répondu odyth 2013-12-08 01:19:07
la source

je ne sais pas à propos de l'iOS4, mais c'est important si vous placez le code dans viewDidLoad et viewWillAppear.

Ie. ce sera le travail.

- (void)viewWillAppear:(BOOL)animated
{
self.customizableViewControllers = nil;
}
3
répondu Rob 2014-02-15 10:48:04
la source

si vous utilisez NavigationController comme 1er ViewController et appuyez sur l'un des boutons pour entrer 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 "si l'instruction" pour éviter le bouton modifier s'affiche lorsque vous cliquez d'abord sur la 5ème ViewControllers et au-dessus.

if (self.selectedIndex >= 4) 
{
    self.customizableViewControllers = nil;
}
2
répondu Lee 2013-03-21 11:02:12
la source

à ceux qui travaillent avec Xcode supérieur à 4.0 (je travaille sur Xcode 4.2 Pour Le Léopard des Neiges):

Vérifiez d'abord où vous changez le tableau de vues la dernière fois. Je pense que cela n'a pas d'importance dans quelle méthode vous mettez votre tableau de vue personnalisable à zéro. Pommes description dit:

Important: ajouter ou supprimer des contrôleurs de vue dans l'interface de votre barre d'onglets rétablit également le tableau des contrôleurs de vue personnalisables à la valeur par défaut, permettant à toutes les vues les contrôleurs seront à nouveau personnalisés. Par conséquent, si vous apportez des modifications à la propriété viewControllers (soit directement, soit en appelant la méthode setviewcontrollers:animated:) et que vous voulez tout de même limiter les contrôleurs de vue personnalisables, vous devez également mettre à jour le tableau d'objets de la propriété customizable viewControllers.

Il a travaillé pour moi, donc merci de l'essayer. J'ai trouvé cette description ici: lien vers la description sur developer.apple.com

un iPhone 6 Plus permettra plus de boutons sur la barre d'onglets en mode paysage qu'en portrait. Malheureusement, cela signifie qu'il réinitialise le tableau personnalisable viewControllers à chaque fois que le périphérique est mis en rotation, et aucune des réponses ici n'a fonctionné pour moi.

j'avais déjà ma propre sous-classe UITabBarController et le fait de passer outre les méthodes setter et getter pour customizable viewControllers était le seul moyen fiable de supprimer le bouton Edit de L'écran suivant:

- (NSArray *)customizableViewControllers
{
    return nil;
}

- (void)setCustomizableViewControllers:(NSArray*)controllers
{
    //do nothing
}
1
répondu Anthony F 2015-11-20 00:21:00
la source

C'est un ajout tardif, mais je pense que c'est une contribution utile. La réponse d'Alexandre peut créer une situation où le rightBarButtonItem est supprimé pour chaque contrôleur de vue sous "Plus D'onglet" (comme Bao Lei l'a mentionné). Je voudrais recommander d'utiliser le Code de Bao Lei, mais avec la différence de l'implorer le didShowViewController méthode du délégué.

comme son code existe maintenant, les utilisateurs tapant l'onglet "Plus" pour revenir à la base UIMoreViewController table peut entraîner des drightbarbuttonitem's appartenant à d'autres viewControllers être mis à néant.

- (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 bogue.

1
répondu Cornell Skyers 2016-07-12 15:31:22
la source

la réponse D'Alex 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 delegate est appelée à chaque fois qu'un contrôleur de vue est poussé ou déclenché sur cette pile de vue. Quand nous poussons d'autres vues sur ce contrôleur de vue "plus", nous ne voulons pas faire cela.

1
répondu Bao Lei 2016-07-12 16:07:49
la source

La seule solution qui a fonctionné pour moi

self.moreNavigationController.navigationBar.topItem?.rightBarButtonItem?.title = ""
self.moreNavigationController.navigationBar.topItem?.rightBarButtonItem?.isEnabled = false
0
répondu Alejandro Luengo 2017-10-20 21:02:04
la source

j'ai essayé la plupart de ces solutions et je courais dans un problème où le bouton d'édition retournerait lors de la rotation de l'appareil. La rotation se réinitialisait vers le contrôleur de première vue, puis quand je retournais vers le contrôleur de plus de vue, le bouton edit était là. La meilleure solution était de devenir le UITabBarControllerDelegate et régler le bouton de la barre de droite à zéro à chaque fois que le contrôleur de vue plus est devenu le contrôleur de vue sélectionné. Cela 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
        }
    }
}
0
répondu Chris 2018-10-01 07:03:19
la source

Autres questions sur