سؤال

أنا في حالة نوع من المواقف التي أحتاجها للبدء بتطبيق قائم على علامات التبويب ، وفي ذلك أحتاج إلى عرض تقسيم لواحد أو أكثر. ولكن يبدو أنه لا يمكن إضافة كائن وحدة تحكم العرض المنقسمة إلى TabbarController. (على الرغم من أنه يمكن إضافة كائن Tabbar إلى SplitViewController).

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

أعتقد أنني واضح في ما شرحته. لذا أيها أي أفكار أو يعملون حولها؟

واسمحوا لي أن أعرف إذا لم أكن واضحا في سؤالي.

شكرًا،

Madhup

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

المحلول 3

لقد قدمت عينة تطبيق. ووجدنا أنه يمكننا القيام بذلك برمجيًا مثل:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    

        NSMutableArray *array = [NSMutableArray array];

        NSMutableArray *tabArray = [NSMutableArray array]; 

        UISplitViewController *splitViewConntroller = [[UISplitViewController alloc] init];

        MainViewController *viewCont = [[MainViewController alloc] initWithNibName:@"MainViewController" bundle:nil];
        [array addObject:viewCont];
        [viewCont release];

        viewCont = [[DetailViewController alloc] initWithNibName:@"DetailViewController" bundle:nil];
        [array addObject:viewCont];
        [viewCont release];




        [splitViewConntroller setViewControllers:array];

        [tabArray addObject:splitViewConntroller];

        [splitViewConntroller release];

        array = [NSMutableArray array];

        splitViewConntroller = [[UISplitViewController alloc] init];

        viewCont = [[MainViewController alloc] initWithNibName:@"MainViewController" bundle:nil];
        [array addObject:viewCont];
        [viewCont release];

        viewCont = [[DetailViewController alloc] initWithNibName:@"DetailViewController" bundle:nil];
        [array addObject:viewCont];
        [viewCont release];

        [splitViewConntroller setViewControllers:array];

        [tabArray addObject:splitViewConntroller];

        [splitViewConntroller release];

        // Add the tab bar controller's current view as a subview of the window
        [tabBarController setViewControllers:tabArray];

        [window addSubview:tabBarController.view];
        [window makeKeyAndVisible];

        return YES;
    }

أتمنى أن يساعدك هذا.

نصائح أخرى

باستخدام منشئ الواجهة ، قم بإنشاء وحدة تحكم عرض تقسيم ووحدة تحكم شريط علامات تبويب وربطها بمنافذك:

@property (nonatomic, retain) IBOutlet UITabBarController *tabBarController;
@property (nonatomic, retain) IBOutlet UISplitViewController *splitViewController;

في مندوب التطبيق الخاص بك didFinishLaunchingWithOption, ، قم بتعيين وحدة التحكم في عرض الانقسام إلى وحدة تحكم شريط علامة التبويب:

splitViewController.tabBarItem = [[[UITabBarItem alloc] initWithTitle:@"Title" image:nil tag:0] autorelease];
NSArray *controllers = [NSArray arrayWithObjects:splitViewController,  /* other controllers go here */ nil];
tabBarController.viewControllers = controllers;
[window addSubview:tabBarController.view];
[window makeKeyAndVisible];

سيؤدي ذلك إلى إنشاء وحدة تحكم شريط علامات تبويب (مع علامة تبويب واحدة فقط في هذه الحالة) ، والتي يتم عرضها بشكل صحيح في جميع التوجهات.

لقد كتبت فئة فرعية لـ UISplitViewController التي ستستمع لتغييرات في اتجاه الجهاز وتوجيه نفسها وفقًا لذلك. مع هذا الفصل ، يمكنني الآن وضع طرق عرض تقسيم داخل UitabbarController وسيتصرف كل طريقة عرض تقسيم بشكل صحيح عند الدوران ، حتى لو لم تكن علامة التبويب الأمامية. لقد نجحت في نشر هذا في Texlege وقد تمت الموافقة عليها للاستخدام في متجر التطبيقات ، ولكن قد تختلف عدد الكيلومترات. يرجى الاطلاع على المستودع في جيثب.

لا تتردد في تفرعها وتعديلها ، وأنا مهتم دائمًا بسماع التعليقات (أو الشكاوى) حول هذا الموضوع. https://github.com/grgcombs/intelligentsplitviewController

للسماح لـ TabbarController بالظهور كعرض رئيسي لـ SplitViewController ، يجب عليك إعادة كتابة TabbarController بحيث تدعم أو توجهات (هكذا على سبيل المثال ، باستخدام فئة لفئة UitabbarController)

شاهد مشاركتي حول إعادة التعديل التحديثي لعرض وحدات التحكم في واجهة شريط علامات تبويب موجودة: http://markivsblog.blogspot.com/2010/04/retrofitting-ipad-uiSplitViewController.html

لقد قمت بإنشاء فئة فرعية UitabbarController التي تنشر رسائل الدوران بشكل صحيح لجميع UisplitViewControllers التي تحتوي عليها. هذا يحافظ على الحالة الداخلية الصحيحة لـ UISplitViewControllers. ومع ذلك ، لا يتم استدعاء إحدى طرق SplitViewController مندوب إذا لم يكن SplitViewController مرئيًا ، لذلك أنا حساب في طريقة عرض Controller ViewWillAppear التفصيلية. لقد أكدت أن هذا يعمل في iOS5.0 - iOS6.1

OstabBarController.M

#import "OSTabBarController.h"

@implementation OSTabBarController

-(void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration{
    [super willRotateToInterfaceOrientation:toInterfaceOrientation duration:duration];
    for(UIViewController *targetController in self.viewControllers){
        if(targetController != self.selectedViewController && [targetController isKindOfClass:[UISplitViewController class]]){
            [targetController willRotateToInterfaceOrientation:toInterfaceOrientation duration:duration];
        }
    }
}

-(void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation{
    [super didRotateFromInterfaceOrientation:fromInterfaceOrientation];
    for(UIViewController *targetController in self.viewControllers){
        if(targetController != self.selectedViewController && [targetController isKindOfClass:[UISplitViewController class]]){
            [targetController didRotateFromInterfaceOrientation:fromInterfaceOrientation];
        }
    }
}

@end

تفاصيل ViewController

@implementation OSDetailViewController

-(void)viewWillAppear:(BOOL)animated{
    //the splitViewController:willHideViewController:withBarButtonItem:forPopoverController: may not have been called
    if(!UIInterfaceOrientationIsPortrait(self.interfaceOrientation)){
        self.navigationItem.leftBarButtonItem = nil;
    }
}

#pragma mark - UISplitViewControllerDelegate Methods

- (void)splitViewController:(UISplitViewController *)splitController willHideViewController:(UIViewController *)viewController withBarButtonItem:(UIBarButtonItem *)barButtonItem forPopoverController:(UIPopoverController *)popoverController
{
    [self.navigationItem setLeftBarButtonItem:barButtonItem animated:YES];

}

- (void)splitViewController:(UISplitViewController *)splitController willShowViewController:(UIViewController *)viewController invalidatingBarButtonItem:(UIBarButtonItem *)barButtonItem
{
    [self.navigationItem setLeftBarButtonItem:nil animated:YES];
}

@end

ضع في اعتبارك أن OS 3.2 يفعل لا تقدم الدعم المناسب للحصول على Splitview كعرض Tabbar.

يمكنك جعلها "تعمل" ولكن سيكون لها أخطاء - الأكبر هو أن تغيير الاتجاه الذي تم إجراؤه في عرض علامة تبويب أخرى لن ينتشر في عرض علامة تبويب Splitview بشكل صحيح ، مما يجعل العرض يحمل الغضب عندما تعود إليه (الجانب الأيسر (الجانب الأيسر تتولى العرض الشاشة ، أو أن عنصر Barbutton مفقود ، وما إلى ذلك).

لقد توصلت إلى استنتاج مفاده أنه يجب علي إنشاء SplitView الخاص بي للاستخدام في TabbarController بسبب هذه المشكلة.

لقد سمعت شائعات بأن Apple كانت تعمل على إصلاح ، لكن الأمر مرت الآن ولم يحدث أي تحديثات لنظام التشغيل iPad - ربما يقوم OS 4 لجهاز iPad بمعالجته.

يمكنك استخدام IB لإنشاء TABTAB وتعديل علامات التبويب إلى SplitViewController.

-(void) makeSplitViewController {
NSMutableArray *controllers = [NSMutableArray arrayWithArray:tabBarController.viewControllers];
int index = 0;

for (UIViewController *controller in tabBarController.viewControllers) {
    if ([controller.tabBarItem.title isEqualToString:@"Stock"]) {
        stockDetailController = [[StockDetailController alloc] initWithNibName:@"StockDetailController" bundle:nil];

        stockMasterController = [[StockMasterController alloc] initWithStyle:UITableViewStylePlain]; 
        stockMasterController.navigationItem.title = date;
        stockMasterController.stockDetailController = stockDetailController;

        UINavigationController *nav = [[[UINavigationController alloc] initWithRootViewController:stockMasterController] autorelease];

        splitViewController = [[UISplitViewController alloc] init];
        splitViewController.tabBarItem = controller.tabBarItem;
        splitViewController.viewControllers = [NSArray arrayWithObjects:nav, stockDetailController, nil];
        splitViewController.delegate = stockDetailController;

        [controllers replaceObjectAtIndex:index withObject:splitViewController];
    }

    index++;
}

tabBarController.viewControllers = controllers;

}

لقد نجحنا في الحصول على uisplitviewController داخل uitabviewController على iPad مع iOS5+.

لجعل قصة طويلة قصيرة: إنها تعمل:

  • خارج الصندوق إذا قبلت انقسام أيضًا في صورة ؛
  • مع القليل من العمل ، إذا كنت ترغب في إخفاء طريقة العرض الرئيسية في الصورة ، وتظهر فقط عند النقر على زر.

تتمثل الخدعة في الحالة الثانية في استخدام feterationspletviewController (انظر بعض المشاركات لأعلى ، Thanx Greg Combs) أو بالمثل تمديد UISplitvc ، وكن حذرًا من أن مندوب الفئة الفرعية لوحدة التحكم splitview هو دائمًا كائن حي.

لقد قمنا بتفصيل العملية على:

https://devforums.apple.com/message/763572#763572

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top