Многоуровневый навигационный контроллер на левой стороне UISplitView с небольшим поворотом - PullRequest
3 голосов
/ 17 мая 2010

Я пытаюсь сделать что-то похожее на (но не совсем похожее) почтовое приложение , найденное на iPad .

В частности, я хотел бы создать приложение на основе вкладок , но на каждой вкладке пользователю будет свой UISplitView .

Каждый UISplitView содержит представление Master и Detail (очевидно).

В каждом UISplitView я бы хотел, чтобы Master был многоуровневым навигационным контроллером , где новые UIViewController помещаются (или извлекаются) из стека. Этот тип навигации в UISplitView - то, где приложение подобно родному приложению электронной почты.

Насколько мне известно, единственное место, где описан приличный "splitviewcontroller внутри uitabbarcontroller", находится здесь: UISplitViewController в TabBar (UITabBarController)? и я пытался следовать принят ответ.

Кажется, что принятое решение работает для меня (т.е. я получаю контроллер панели вкладок, который позволяет мне переключаться между различными UISplitViews).

Проблема в том, что я не знаю, как сделать левую часть UISplitView многоуровневым навигационным контроллером.

Вот код, который я использовал в своем делегате приложения для создания начального «разделенного представления» внутри «контроллера панели вкладок» (это в значительной степени соответствует предложению в вышеупомянутой ссылке).

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

    NSMutableArray *tabArray = [NSMutableArray array];

    NSMutableArray *array = [NSMutableArray array];
    UISplitViewController *splitViewController = [[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];
    [splitViewController setViewControllers:array];
    [tabArray addObject:splitViewController];
    [splitViewController release];



    array = [NSMutableArray array];
    splitViewController = [[UISplitViewController alloc] init];
    viewCont = [[Master2 alloc] initWithNibName:@"Master2" bundle:nil];
    [array addObject:viewCont];
    [viewCont release];
    viewCont = [[Slave2 alloc] initWithNibName:@"Slave2" bundle:nil];
    [array addObject:viewCont];
    [viewCont release];
    [splitViewController setViewControllers:array];
    [tabArray addObject:splitViewController];
    [splitViewController 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;
}

класс MainViewController - это UIViewController, который содержит следующий метод:

- (IBAction)push_me:(id)sender {
    M2 *m2 = [[[M2 alloc] initWithNibName:@"M2" bundle:nil] autorelease];
    [self.navigationController pushViewController:m2 animated:YES];
}

этот метод присоединяется (через конструктор интерфейса) к UIB-кнопке, найденной в MainViewController.xib Очевидно, что описанный выше метод (push_me) должен создать второй UIViewController (называемый m2) и выдвинуть m2 в вид слева от разделенного вида при нажатии кнопки UIB. И все же он ничего не делает при нажатии кнопки (хотя я могу сказать, что метод вызывается).

Мысли о том, где я иду не так?

ТИА!

Ответы [ 2 ]

0 голосов
/ 16 марта 2016

Создайте подкласс вашего (многоуровневого) главного контроллера навигации и переопределите следующий метод:

- separateSecondaryViewControllerForSplitViewController:

Внутри переопределенного метода выполните метод суперкласса и проверьте, хотите ли вы отделить возвращаемый контроллер представления от него, если нет, то дайте ему снова объединиться, вызвав метод collapse:

- collapseSecondaryViewController:forSplitViewController:

Пример шаблона в Swift:

import UIKit

class MasterNavigationController: UINavigationController {

    override func separateSecondaryViewControllerForSplitViewController(splitViewController: UISplitViewController) -> UIViewController? {

        // Separate a view controller from master navigation controller
        if let secondaryViewController = super.separateSecondaryViewControllerForSplitViewController(splitViewController) {

            if /* Check if secondaryViewController is your Detail View Controller (you can check for its class or restorationIdentifier for example) */ {

                return secondaryViewController

            } else {

                // Remerges the separated view controller back to the master navigation controller
                super.collapseSecondaryViewController(secondaryViewController, forSplitViewController: splitViewController)
            }
        }
        return nil
    }
}
0 голосов
/ 21 мая 2010

Вы уверены, что MainViewController является подклассом UINavigationController?

Если вы хотите иметь возможность выдвигать / выдвигать контроллеры, тогда mainViewController должен быть навигационным контроллером (или подклассом), и тогда вы должны выдвигать контроллеры (например, TableViewControllers) на него. Вы можете увидеть эту структуру в проекте splitView по умолчанию (откройте IB и осмотрите виды).

Вот достойное руководство по UISplitViewController: http://mobiforge.com/developing/story/developing-split-view-based-apps-ipad

...