Как pushviewcontroller для viewcontroller хранится в tabbaritem? - PullRequest
1 голос
/ 09 апреля 2010

Прежде всего, я знаю, что это длинный вопрос. ГАРАНТИЯ ОТДЫХА Я попытался выяснить это самостоятельно (см .: StackOverflow # 2609318 ). Это сводит меня, Бэтти!

После попытки и неудачи в реализации моей собственной функции EDIT в стандартном moreNavigationController, я решил повторно реализовать свою собственную функцию MORE.

Я сделал следующее:

Добавить контроллер вида HOME, с которым я начинаю: initWithRootViewController

Добавьте 3 другие вкладки по умолчанию с помощью:

ResortsListViewController *resortsListViewController;
resortsListViewController = [[ResortsListViewController alloc] initWithNibName:@"ResortsListView" bundle:nil];
resortsListViewController.title = [categoriesDictionary objectForKey:@"category_name"];
resortsListViewController.tabBarItem.image = [UIImage imageNamed:@"whatever.png"];
resortsListViewController.navigationItem.title=@"whatever title";
localNavigationController = [[UINavigationController alloc] initWithRootViewController:resortsListViewController];
localNavigationController.navigationBar.barStyle = UIBarStyleBlack;
[localControllersArray addObject:localNavigationController]; 
[localNavigationController release];
[resortsListViewController release];

Они работают, когда я добавляю их на панель вкладок. (т.е. нажмите на них, и он перейдет к контроллеру представления)

Затем я добавляю свой собственный контроллер MORE на панель вкладок:

MoreViewController *moreViewController;
moreViewController = [[MoreViewController alloc] initWithNibName:@"MoreView" bundle:nil];
moreViewController.title = @"More";
moreViewController.tabBarItem.image = [UIImage imageNamed:@"more.png"];
moreViewController.navigationItem.title=@"More Categories";
localNavigationController = [[UINavigationController alloc] initWithRootViewController:moreViewController];
localNavigationController.navigationBar.barStyle = UIBarStyleBlack;
[localControllersArray addObject:localNavigationController]; 
[localNavigationController release];
[moreViewController release];

Тогда

tabBarController.viewControllers = localControllersArray;
tabBarController.moreNavigationController.navigationBar.barStyle = UIBarStyleBlack;  
tabBarController.customizableViewControllers = [NSArray arrayWithObjects:nil];
tabBarController.delegate = self;

Это создает необходимые связи. Хорошо, пока все хорошо. Я получаю вкладку HOME, 3 вкладки категории и настраиваемую вкладку MORE - все это работает.

в контроллере представления вкладок БОЛЕЕ я реализую простое табличное представление, которое отображает все остальные вкладки в строках. ПОЭТОМУ я хочу иметь возможность переключать их в панель вкладок и из нее, я создал их ПРОСТО, как я делал вышеупомянутый resortslistviewcontroller (т.е. как контроллеры представления в массиве). Когда я вытаскиваю их для отображения заголовка в виде таблицы (чтобы пользователь мог перейти к этому «представлению»), я просто делаю следующее:

    // [myGizmoClass CategoryArray] holds the array of view controller tab bar items that are NOT shown on the main screen.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    ... etc...

        UIViewController *Uivc = [[myGizmoClass plusCategoryArray] objectAtIndex:indexPath.row];
        cell.textLabel.text = [Uivc title];
        cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
    }

Вот где оно проваливается:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

    MyGizmoClass *myGizmoClass= [MyGizmoClass sharedManager];

    UIViewController *tbi = [[myGizmoClass plusCategoryArray] objectAtIndex:indexPath.row];
    NSLog(@"%@\n",[[tbi navigationItem ]title]);

    [self.navigationController pushViewController:tbi animated:YES];

}

Это ошибка, которую я получаю («Банкоматы» - это заголовок для выбранной ячейки таблицы), поэтому я знаю, что заголовок Uivc вытягивает правильный заголовок и, следовательно, правильный «objectatindex»:

2010-04-09 11: 25: 48.222 MouseAddict [47485: 207] Банкоматы 2010-04-09 11: 25: 48.222 MouseAddict [47485: 207] *** Завершение приложения из-за необработанного исключения NSInvalidArgumentException, причина: Нажатие на навигационный контроллер не поддерживается '

БОЛЬШОЙ ВОПРОС: Как мне сделать связанный ВИД UIViewController *tbi шоу и получить его в поле зрения?

Я догадываюсь, что UIViewController - правильный класс для этого tbl .. Я не уверен. НО я просто хочу получить представление, чтобы я мог поместить его в стек.

Может кто-нибудь PLZ помочь?

Чтобы ответить на вопрос kovpas ниже: myGizmoClass - это синглтон (синглтонский класс myGizmo от apple. Массив viewcontrollers хранится в том же виде, что и в [localControllersArray addObject:localNavigationController]; (в первом фрагменте кода выше) ). И он вставляет и извлекает его правильно, о чем свидетельствует тот факт, что когда я NSLOG [Uivc title], журнал печатает ATMs. Это означает, что plusCategoryArray правильно хранит и извлекает viewController (если, действительно, это это то, что хранится).

Pushing a navigation controller is not supported действительно беспокоит меня. Почему viewController возвращает navigationController и возможно ли принудительно navigationController получить из него «толкаемое» представление ... или в navigationController есть какой-то элемент, который является представлением?

Ответы [ 2 ]

4 голосов
/ 09 апреля 2010

Из ошибки выглядит, как будто ваш класс Gizmo имеет массив UINavigationControllers, а не UIViewControllers. Поэтому вместо этого нажмите:

[self.navigationController pushViewController:[[tbi viewControllers] lastObject] animated:YES];

Если массив - это тот же массив, который вы называли localControllers выше, тогда это должно работать лучше. Или вы можете просто создать массив без UINavigationControllers, они не нужны, если вы собираетесь перенести их на свой контроллер навигации большего количества контроллеров.

1 голос
/ 09 апреля 2010

Я не уверен, но похоже, что эта ошибка появляется, когда вы пытаетесь вставить UINavigationController в другой UINavigationController.Не могли бы вы предоставить реализацию MyGizmoClass?

...