Отхвърляне на изскачащия контролер за разделен изглед

Имам UISplitViewController с главния изглед, настроен така:

UITabBarController
  Tab1:
    UINavigationController -> UIViewController -> UIViewController
  Tab2:
    UINavigationController -> UIViewController

Всеки от UIViewControllers е табличен изглед и когато потребителят избере ред в последния, изображение се показва в детайлния изглед, който съдържа UIScrollView.

Контролерът на лентата с раздели е UISplitViewControllerDelegate и управлява поставянето на бутона в лента с инструменти в горната част на изгледа за превъртане.

Проблемът е, че искам да добавя код за отхвърляне на изскачащия прозорец, когато потребителят направи своя избор. Указателят към изскачащия прозорец трябва да бъде записан в контролера на лентата с раздели, когато бутонът се издигне, и след това да се използва за отхвърляне на изскачащия прозорец на няколко контролера за изглед надолу, когато потребителят направи окончателния си избор. Изглежда няма начин за контролера на изгледа, който се нуждае от този указател, да стигне до него, без да прави нещо грубо като съхраняването му в App Delegate.

Не виждам други хора да задават този въпрос, което ме кара да вярвам, че отново съм пропуснал нещо просто. Моля, просветете ме!


person janineanne    schedule 13.06.2012    source източник


Отговори (2)


Изглежда, че вашият контролер на лентата с раздели вече е подклас на UITabBarController, което означава, че вече имате някакъв персонализиран код там. Бих предположил, че контролерът на лентата с раздели е основният собственик на изскачащия прозорец и е отговорност на контролера за изглед на таблица просто да уведоми контролера на лентата с раздели, че е направен избор. Контролерът на лентата с раздели може да отговори на това съобщение, като отхвърли изскачащия прозорец. Можете да се възползвате от факта, че UIViewController вече има метод за достъп до контролера на лентата с раздели, който съдържа даден контролер.

Така че ще изглежда нещо подобно:

@interface MyTabBarController : UITabBarController
- (void)itemWasSelected;
@end

@implementation MyTabBarController {
  UIPopoverController *popover;
}

- (void)itemWasSelected {
  [popover dismissPopoverControllerAnimated:YES];
}
@end

//////////////

@implementation TableController

- (void)tableView:(UITableView *)tv didSelectRowAtIndexPath:(NSIndexPath *)path {
  // Do whatever else you want to do
  MyTabBarController *tabController = (MyTabBarController *)self.tabBarController;
  [tabController itemWasSelected];
}

С това решение контролерът на таблицата не трябва да знае нищо за popover; той просто трябва да знае, че ще бъде представен в MyTabBarController, което изглежда разумно да знае.

person BJ Homer    schedule 23.06.2012

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

person crackity_jones    schedule 18.06.2012