Wie die Schaltfläche Bearbeiten deaktivieren, die in dem mehr Schnitt eines UITabBarController erscheint?

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

  •  05-07-2019
  •  | 
  •  

Frage

In meiner Anwendung (bezogen auf der Tab-Leiste Anwendung XCode Vorlage) verwende ich einen UITabBarController eine Liste der verschiedenen Abschnitte der Anwendung anzuzeigen, die der Benutzer zugreifen kann.

Standardmäßig zeigt die UITabBarController ein ‚Mehr‘ -Taste in der Tab-Leiste, wenn es mehr als 5 Einzelteile. Außerdem ist es dem Benutzer erlaubt, die Elemente auszuwählen, die er in der Tab-Leiste sichtbar sein sollen.

Zur Zeit kann ich nicht Einsparung realisieren und den Zustand der Tab-Leiste Controller geladen, so möchte ich die Schaltfläche ‚Bearbeiten‘ deaktivieren.

Gibt es eine Möglichkeit zu deaktivieren / ausblenden ‚Bearbeiten‘ Bar-Taste, die auf dem ‚Mehr‘ Navigation-Controller von UITabBarController erscheint?

Ich habe versucht:

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

und

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

, aber sie scheinen nicht zu funktionieren.

War es hilfreich?

Lösung

Werden Sie ein Delegierter von moreNavigationController (es ist ein UINavigationController) und fügen Sie diese:

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

Jetzt wird es nicht angezeigt. Der Schlüssel, was zu beachten ist, dass Schaltfläche Bearbeiten nicht nach Regler Schöpfung erscheint, aber bevor die Ansicht angezeigt wird, und wir sollten still bis zu diesem Moment sitzen und dann, wenn der Controller den Bildschirm angezeigt werden wird, werden wir die Taste ausknocken, so dass es werden keine Chance haben, um es wieder zu schaffen. :)

Andere Tipps

customizableViewControllers ist ein Array; legen Sie es auf das leere Array alle Bearbeitungen zu deaktivieren.

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

Ich habe versucht, und hier ist ein Beispiel.

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

"Bearbeiten" Button entfernen

    - (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 Ihrem AppDelegate.h

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

korrigieren Sie mich, wenn ich falsch bin.

Ich konnte diese Arbeit mit dem folgenden Code erhalten. Ich habe eine CustomTabViewController und dann modifiziert meine Tab Bar-Controller der Klasse Identität in Interface Builder diese benutzerdefinierten Klasse zu verwenden. Hier ist der Code, der verwendet wird (.h und .m Dateiinhalte). Der Schlüssel ist die Einstellung der Eigenschaft auf Null, die auf die Schaltfläche Bearbeiten, wird sie nicht angezeigt werden. Details siehe: http://developer.apple.com/library/ios/documentation/uikit/reference/UITabBarController_Class/Reference/Reference.html#//apple_ref/occ/instp/UITabBarController/customizableViewControllers „Wenn das Array leer ist oder der Wert dieser Eigenschaft ist null, die Tab-Leiste erlaubt es nicht, alle Elemente neu angeordnet werden.“

#import <UIKit/UIKit.h>

@interface CustomTabBarController : UITabBarController {

}
@end

#import "CustomTabBarController.h"


@implementation CustomTabBarController

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

@end

Dies kann wie so erreicht werden. Es ist nicht die eleganteste Lösung, aber es funktioniert ™.

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

Sie einfach eine Zeile Code in der Lebenszyklusmethode hinzufügen, das heißt Anwendung tat Finish Start:

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

}

@ m4rkk & @lan Terrell, dass Code funktioniert nicht.

war ich nicht in der Lage, es zu bekommen, so ganz deaktiviere ich nur die Navigationsleiste.

tabBarController.moreNavigationController.navigationBar.hidden = YES;

Ich weiß nicht, über iOS4, aber es zählt, wenn Sie den Code in viewDidLoad vs viewWillAppear setzen.

Dh., Dies funktionieren wird.

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

Wenn Sie Navigation als erster Viewcontroller verwenden und drücken Sie eine der Taste UITabBarController einzugeben. Dann außer Sie den Code unten,

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

Sie müssen diese „if-Anweisung“ hinzufügen die Schaltfläche Bearbeiten zeigt bis zu vermeiden, wenn Sie zuerst den 5. Viewcontrollers klicken und oben.

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

An diejenigen, die mit Xcode arbeiten mehr als 4,0 (Ich arbeite an Xcode 4.2 für Snow Leopard):

Überprüfen Sie zunächst, wo ändern Sie das Array von Ansichten zum letzten Mal. Ich denke, es ist nicht in der egal Methode Sie Ihren customizableView-Array auf Null gesetzt. Äpfel Beschreibung sagt:

  

Wichtig: Hinzufügen oder Entfernen von View-Controller in der Tab-Leiste Schnittstelle wird auch die Palette individuell anpassbarer View-Controller auf den Standardwert, so dass alle View-Controller wieder angepasst werden. Deshalb, wenn Sie Änderungen an der Viewcontrollers Eigenschaft machen (entweder direkt oder durch die setViewControllers Aufruf: animierte: Methode). Und wollen immer noch die individuell anpassbare Ansicht Controller zu begrenzen, müssen Sie auch die Anordnung von Objekten in der customizableViewControllers Eigenschaft aktualisieren

Es ist für mich gearbeitet, so wenden Sie sich bitte versuchen Sie es heraus. Ich fand diese Beschreibung hier: Link zur Beschreibung auf developer.apple.com im Kapitel "Verhindern, dass die Anpassung von Tabs".

Ein iPhone 6 Plus mehr Tasten auf der Tab-Leiste im Querformat als im Portrait ermöglichen. Leider bedeutet dies, den customizableViewControllers Array zurücksetzt, wenn das Gerät gedreht wird, und keine der Antworten hier für mich gearbeitet.

Ich hatte schon meine eigene UITabBarController Unterklasse und Überschreiben die Setter und Getter-Methoden für customizableViewControllers war die einzige zuverlässige Art und Weise auf die Schaltfläche Bearbeiten aus dem Mehr-Bildschirm zu entfernen:

- (NSArray *)customizableViewControllers
{
    return nil;
}

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

Dies ist eine späte Zugabe, aber ich denke, es ist ein hilfreicher Beitrag ist. Aleks N Antwort kann eine Situation schaffen, in der die rightBarButtonItem für jeden View-Controller unter dem Abschnitt "Weitere Tab" entfernt (wie Bao Lei erwähnt). Ich mag mit Bao Lei-Code empfehlen, jedoch mit dem Unterschied von implenting es sich der didShowViewController Delegatmethode.

Wie sein Code jetzt existiert, Benutzer das „Mehr“ Tab tippt auf die Basis zurückkehrt UIMoreViewController Tabelle kann dazu führen, rightBarButtonItem der zu anderen Viewcontrollers gehört, auf Null gesetzt werden.

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

Der Unterschied ist klein, aber es hat mir eine beträchtliche Menge an Zeit, um diese Fehler zu finden.

Aleks N Antwort funktioniert, aber ich möchte ein wenig ändern

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

Da dieses Delegatmethode jedes Mal aufgerufen, wenn ein View-Controller auf dieser Ansicht Stapel geschoben oder aufgetaucht. Wenn wir drängen andere Ansichten auf diese „Mehr“ View-Controller, die wir nicht wollen, dies zu tun.

Die einzige Lösung, die für mich gearbeitet

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

Ich habe versucht, die meisten dieser Lösungen und wurde in ein Problem laufen, wo die Schaltfläche Bearbeiten zurückkehren würde, wenn das Gerät gedreht wird. Die Drehung des ersten View-Controller zurückgesetzt würde, dann, wenn ich auf den mehr View-Controller zurückkehren, war es die Schaltfläche Bearbeiten. Die beste Lösung war die UITabBarControllerDelegate zu werden und die richtige Bar-Taste auf Null gesetzt jederzeit der mehr View-Controller wurden die ausgewählten View-Controller. Dies funktioniert für iOS 12.11.

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
        }
    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top