Пара проблем с настройкой примера Apple MultipleDetailViews

#iphone #ios4 #ipad

#iPhone #ios4 #iPad

Вопрос:

Я пытался добавить / реализовать этот пример в мои существующие тесты приложений с разделенным просмотром.

Пример Apple

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

У меня есть rootviewcontroller или вид слева, и при выборе чего-либо здесь в этот вид добавляется новый вид. При выборе чего-либо в этом «расширенном представлении» я хочу изменить детальный вид или вид справа. В этом отличие от примера apple, где в rootview нет принудительного просмотра и, следовательно, ссылки не нарушаются.

Ниже приведен мой код изменения — инициализируется новый просмотр DVCases, но загрузка не происходит.

Проблемы связаны с проблемами учащихся, связанными с моими классами.

  1. Приведенный ниже код находится в моем коде реализации RootViewController, но моя ссылка на splitviewcontroller не работает, если загружено новое представление.

  2. Второе я.navigationcontroller неверен, потому что я отправил второе представление в rootviewcontroller.

Чтобы централизовать и упростить код, который я сделал, используя делегат принудительного просмотра в событии didselect, я вызываю метод, найденный в rootviewcontroller, передавая индекс в качестве параметра. Код для моего пользовательского метода содержит то, что приведено ниже.

Итак, мой вопрос в том, как мне это сделать в моей ситуации, когда я перенес другие представления в rootview или левую сторону. Похоже, что после нажатия view ссылка на splitviewcontroller исчезла, и self.navigationcontroller также исчез / или неправильный.

 UIViewController <SubstitutableDetailViewController> *detailViewController = nil;

if (value == 0) {
    DVCases *newDetailViewController = [[DVCases alloc] initWithNibName:@"DVCases" bundle:nil];
    detailViewController = newDetailViewController;
}

// Update the split view controller's view controllers array.
NSArray *viewControllers = [[NSArray alloc] initWithObjects:self.navigationController, detailViewController, nil];
splitViewController.viewControllers = viewControllers;
[viewControllers release];

// Dismiss the popover if it's present.
if (popoverController != nil) {
    [popoverController dismissPopoverAnimated:YES];
}

// Configure the new view controller's popover button (after the view has been displayed and its toolbar/navigation bar has been created).
if (rootPopoverButtonItem != nil) {
    [detailViewController showRootPopoverButtonItem:self.rootPopoverButtonItem];
}

[detailViewController release];
  

Я был бы признателен за любые советы или помощь, которые у вас могут быть.

Комментарии:

1. в первом пункте вы упоминаете, что используете тот же код, что и в примере Apple, и у вас проблемы со ссылками, я прав? и во-вторых, вы говорите, что добавили вложенный просмотр, а не вставили его, это то, что вы хотите сказать?

2. Прошу прощения за то, что не задал четкого вопроса. Я надеюсь, что теперь моя терминология стала лучше.

Ответ №1:

Инициализация любого viewcontroller класса не означает, что он вызовет viewDidLoad метод.

viewDidLoad метод будет вызываться только при загрузке представления этого viewController . Обычно мы делаем это либо следующими методами.

 1. Pushing it on navigation stack.
2. Presenting it using modal transition.
3. Adding it on some other view using [someView addSubView:controller.view];
4. Selecting any tabBar item for the first time Or tapping tabBar Item twice.
there may be some other scenarios.
  

Но прямо сейчас в вашем коде я не вижу ни одного из этих элементов.

Инициализация означает, что вы вызываете прямой метод для инициализации (вызывая его конструктор), как здесь, в приведенном выше коде, который initWithNibName будет вызывать этот метод, а DVClass не какой-либо другой (до тех пор, пока этот метод не вызывал другие методы внутри него).

Спасибо

Комментарии:

1. Я согласен — но в этом случае метод, рекомендованный Apple, заключается в замене правостороннего контроллера просмотра из массива контроллеров UISplitViewController.

2. но в этом случае первый и второй контроллеры просмотра сами по себе не имеют никакого метода viewDidLoad. Но у них есть реализация метода showRootPopoverButtonItem.

3. Да, они есть, и они работают. Я обнаружил проблемы и теперь изменил вопрос. Я думаю, что это предпочтительный способ на этом форуме.

Ответ №2:

Поскольку я учусь правильно кодировать, мои проблемы сосредоточены вокруг этого.

Приведенный выше код идеален, если вы вызываете его, используя тот же экземпляр. Я не был. Таким образом, это не работало.

В итоге я сделал свой RootViewController делегатом для метода, который имеет приведенный выше код. Таким образом, когда в другом представлении — это представление может вызывать этот метод, и надлежащий или реальный экземпляр RootViewController реализует его.