كيفية تعطيل تحرير الزر الذي يظهر في أكثر من قسم من UITabBarController?

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

  •  05-07-2019
  •  | 
  •  

سؤال

في التطبيق (على أساس شريط التبويب التطبيقات XCode قالب) يمكنني استخدام UITabBarController لعرض قائمة من أقسام مختلفة من التطبيقات التي يمكن للمستخدم الوصول إليها.

بشكل افتراضي ، UITabBarController يعرض 'المزيد' زر في شريط علامات التبويب عندما يكون هناك أكثر من 5 بنود.كما أنه يسمح للمستخدم لتحديد العناصر التي يريد أن تكون مرئية في شريط علامات التبويب.

حاليا لا أستطيع تنفيذ توفير وتحميل الدولة من شريط التبويب تحكم ، لذلك أريد أن تعطيل زر 'تحرير'.

هل هناك أي طريقة لتعطيل/إخفاء 'تحرير' شريط الزر الذي يظهر على "المزيد" الملاحة تحكم UITabBarController?

حاولت:

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

و

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

ولكن لا يبدو أن العمل.

هل كانت مفيدة؟

المحلول

واصبح مندوب moreNavigationController (وهو UINavigationController) وإضافة هذا:

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

وانها لن تظهر الآن. الشيء الرئيسي هو أن تنظر يظهر زر تحرير وليس بعد إنشاء وحدة تحكم، ولكن قبل عرض وجهة النظر، وينبغي أن نجلس بصمت حتى تلك اللحظة وبعد ذلك، عندما تحكم يجري لعرض الشاشة، ونحن سوف تدق على زر الخروج بحيث فإنه لن تكون هناك فرصة لإنشائه مرة أخرى. :)

نصائح أخرى

وcustomizableViewControllers هو مجموعة. تعيين إلى مجموعة فارغة إلى تعطيل كافة التحرير.

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

ولقد حاولت وهنا مثال.

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

لإزالة "تحرير" زر

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

في AppDelegate.h بك

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

وتصحيح لي إذا كنت مخطئا.

وكنت قادرا على الحصول على هذا العمل مع التعليمات البرمجية التالية. أنا خلقت CustomTabViewController ثم تعديل الدرجة هويتي تبويب بار المراقب المالي في واجهة البناء لاستخدام هذه الفئة المخصصة. هنا هو رمز أنه يستخدم (. ح ومحتويات الملف .M). المفتاح هو وضع الخاصية إلى لا شيء، والذي يسبب زر تحرير للا يتم عرض. لمزيد من التفاصيل، انظر: <لأ href = "http://developer.apple.com/library/ios/documentation/uikit/reference/UITabBarController_Class/Reference/Reference.html#//apple_ref/occ/instp/UITabBarController/customizableViewControllers" يختلط = "نوفولو"> http://developer.apple.com/library/ios/documentation/uikit/reference/UITabBarController_Class/Reference/Reference.html#//apple_ref/occ/instp/UITabBarController/customizableViewControllers "إذا المصفوفة فارغة أو قيمة هذه الخاصية هي لا شيء، شريط التبويب لا تسمح لأي البنود التي سيتم ترتيبها."

#import <UIKit/UIKit.h>

@interface CustomTabBarController : UITabBarController {

}
@end

#import "CustomTabBarController.h"


@implementation CustomTabBarController

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

@end

وهذا لا يمكن أن يتحقق مثل هذا. انها ليست الحل الأكثر أناقة، ولكن يعمل ™.

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

وببساطة إضافة سطر من التعليمات البرمجية في أسلوب دورة حياة أي تطبيق فعل النهاية المطلقة:

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

}

و @m4rkk وlan تيريل أن رمز لا يعمل.

وأنا لم أتمكن من الحصول عليه لذلك أنا مجرد تعطيل شريط التنقل تماما.

tabBarController.moreNavigationController.navigationBar.hidden = YES;

وأنا لا أعرف عن نظام التشغيل iOS4، ولكن لا يهم إذا كنت وضعت رمز في viewDidLoad مقابل viewWillAppear.

وبمعنى آخر، هذا العمل.

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

إذا كنت تستخدم NavigationController كما ViewController الخاص بك 1st واضغط على زر واحد للدخول UITabBarController. ثم بصرف النظر عن إضافة رمز أدناه،

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

وتحتاج إلى إضافة هذا "إذا البيان" لتجنب زر تحرير يظهر عند أول انقر على ViewControllers 5 وما فوق.

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

وفي تلك العمل مع كسكودي أكبر من 4.0 (أنا أعمل على كسكودي 4.2 لسنو ليوبارد):

وتحقق في البداية أين قمت بتغيير مجموعة من وجهات نظر آخر مرة. أعتقد أنه لا يهم في الطريقة التي تقوم بتعيين customizableView صفيف إلى الصفر. التفاح وصف يقول:

<اقتباس فقرة>   

هام: إضافة أو إزالة وحدات التحكم عرض في واجهة شريط التبويب يعيد أيضا مجموعة من وحدات التحكم عرض للتخصيص إلى القيمة الافتراضية، السماح لجميع وحدات التحكم بغية تخصيص مرة أخرى. لذلك، إذا قمت بإجراء تعديلات على الممتلكات viewControllers (إما مباشرة أو عن طريق استدعاء setViewControllers: الرسوم المتحركة: طريقة). ولا تزال ترغب في الحد من وحدات التحكم عرض للتخصيص، ويجب عليك أيضا تحديث مجموعة من الكائنات في الممتلكات customizableViewControllers

وعملت بالنسبة لي، لذا يرجى محاولة الخروج منها. لقد وجدت هذا الوصف هنا: تصل إلى وصف على developer.apple.com في الفصل "منع التخصيص من علامات التبويب".

وجود اي فون 6 زائد سيتيح المزيد من الأزرار على شريط التبويب في وضع أفقي مما كانت عليه في صورة. للأسف هذا يعني إعادة تعيين مجموعة customizableViewControllers كلما تدوير الجهاز، وليس من الإجابات هنا عملت بالنسبة لي.

وكان لي بالفعل بلدي UITabBarController فرعية وتجاوز اضع وجالبة طرق customizableViewControllers هو السبيل الوحيد الموثوق بها لإزالة زر تحرير من عن الشاشة:

- (NSArray *)customizableViewControllers
{
    return nil;
}

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

هذه إضافة متأخرة ولكن أعتقد أنها مفيدة مساهمة.أليكس ن الجواب يمكن أن تخلق وضعا حيث rightBarButtonItem هو إزالة كل عرض المراقب المالي تحت عنوان "أكثر علامة التبويب" (كما باو لى المذكورة).أود أن أوصي باستخدام باو لى رمز ، ولكن مع فارق من implenting هذا الأمر didShowViewController مندوب الأسلوب.

كما رمز له وجود الآن للمستخدمين الاستفادة من "أكثر" tab للعودة إلى القاعدة UIMoreViewController الجدول يمكن أن يسبب rightBarButtonItem هو ينتمون إلى أخرى 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;
    }
}

الفرق هو صغير ولكن الأمر استغرق مني وقتا طويلا للعثور على هذا الخطأ.

والجواب أليكس N وتعمل، ولكن أود أن تعديل قليلا

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

ومنذ هذا الأسلوب يسمى مندوب في كل مرة عندما يتم الضغط وحدة تحكم عرض أو برزت على هذا الرأي المكدس. عندما نكون دفع جهات النظر الأخرى على هذا "المزيد" تحكم الرأي، نحن لا نريد أن نفعل ذلك.

والحل الوحيد الذي عملت بالنسبة لي

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

وحاولت معظم هذه الحلول والوقوع في مشكلة حيث سيعود على زر تعديل عند تدوير الجهاز. ان تناوب إعادة تعيين إلى وحدة تحكم جهة النظر الأولى، ثم عندما عدت إلى وحدة تحكم عرض المزيد، وكان زر تحرير هناك. وكان أفضل حل لتصبح UITabBarControllerDelegate وتعيين زر شريط الحق في أي وقت لا شيء أصبح وحدة تحكم عرض المزيد وحدة تحكم العرض المحددة. هذا وتعمل لدائرة الرقابة الداخلية 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
        }
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top