2010-09-28 3 views
3

Я разрабатываю для iPad и создал стандартное приложение UISplitViewController, используя шаблон, предоставленный в Xcode - стандартном UITableView слева и подробный вид справа.iPad UISplitViewController несколько корневых просмотров

Я изменил шаблон так, что, когда пользователь выбирает ячейку таблицы из левого представления, он подталкивает новый вид таблицы в своем месте (все еще с левой стороны). Это работает без проблем, но я хотел бы иметь возможность обновлять существующий подробный вид из нового табличного представления - вроде как работает приложение Apple Mail.

- Я не пытаюсь создать несколько представлений на подробном представлении (справа). Я прочитал документацию и увидел пример кода, предоставленный Apple.

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

Более подробно: -

Использование detailViewController.detailItem = @"Test"; в методе делегата RootView didSelectTableRowAtIndexPath обновляет метку Детальный вид. Использование одного и того же кода в недавно перенесенном представлении таблицы не обновляет ярлык - я пропускаю контрольную точку или что-то в этом роде?

С момента публикации я попытался использовать протоколы & делегатов для обновления ярлыка на подробном представлении. Ярлык обновляется правильно, если изменить его с Root View с помощью новых методов, однако, когда я нажимаю новое представление на корневой режим (слева), я больше не могу обновлять метку.

ответ

1

В какой-то момент после создания RootViewController (или, может быть, даже в методе пользовательских инициализации) вы устанавливаете делегата для DetailViewController, его общую ошибку, когда новый RootViewController надевается на NavController, что вы забыли снова установите delgate.

Вы, вероятно, создается новый контроллер в:

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

метод и запись/увеличивающийся уровень нового контроллера, прежде чем поместить его на NavController.После создания этого нового контроллера снова установите делегата.

newRootController.myDelegate = self.myDelegate; 

Прежде чем это сделать Если вы NSLog делегата перед его использованием, вы, вероятно, найдете его нуль.

+0

Большое спасибо, работал шарм! Я уже установил делегат при нажатии нового представления, но я создавал новый экземпляр вместо ссылки на существующий делегат. Еще раз спасибо! – KSoza

1

Попробуйте свойство viewControllers вашего UISplitViewController

@property (неатомическая, копия) NSArray

* viewControllers Обсуждение Массива в этом свойстве должен содержать ровно два контроллера представления. Представлены контроллеры Слева направо в разрезе интерфейс, когда он находится в ландшафте Ориентация. Таким образом, контроллер вида с индексом 0 отображается слева от , а с правой стороны интерфейса отображается контроллер вида с индексом 1.

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

+0

Насколько я могу судить, свойство viewControllers UISplitViewController используется для назначения контроллеров представлений в представлении (!). Я думаю, что моя проблема здесь связана с делегацией или протоколами. Независимо от того, что я пытаюсь, я не могу заставить его работать ... любые другие предложения? – KSoza

0

Обратите внимание на подробный монитор управления! Вы должны передать эту переменную экземпляра в новое корневое представление. Так что-то вроде этого:

newRootViewController.detailViewController = self.detailViewController 

В противном случае ваш новый корневой вид никогда не узнает о detailView. Для вашего нового корня (таблица) зрения, вы должны сделать что-то вроде:

#import <UIKit/UIKit.h> 
@class DetailViewController; 

    @interface VorhersageTable : UIViewController { 
     UITableView *vorhersageTableView; 
     DetailViewController *detailViewController; 
    } 
    @property (nonatomic, retain) IBOutlet UITableView *vorhersageTableView; 
    @property (nonatomic, retain) DetailViewController *detailViewController; 
    @end 

объявить свойство detailViewController в новом классе.

0

Добавить это в RootViewController.didselectRow, прежде чем нажать вторую таблицу (например SubRoot)

SubRoot *subController = [[SubRoot alloc] initWithNibName:@"SubRoot" bundle:nil]; 
subController.detailViewController = self.detailViewController; 

И создать SubRoot.h и SubRoot.m похожий на RootViewController.

@class DetailViewController; 
@interface SubRoot : UITableViewController { 
    DetailViewController *detailViewController; 
} 
@property (nonatomic, retain) DetailViewController *detailViewController; 
@end 

затем синтезировать detailViewController.

Надеюсь, это поможет.