2013-11-15 2 views
0

У меня есть PreviewController: UIViewController, который используется для отображения документа в полноэкранном режиме. Он входит в состав UINavigationViewController. Также является делегатом от UISplitViewController.UIViewController освобождается до вызова метода делегата

Когда он толкается, он скрывает masterView от UISplitViewController. (Методы 1 - 3 - 2 называются)

Когда он исчезает (при нажатии кнопки «назад»), он показывает masterView из UISplitViewController. (Методы 4 - 2 называются)

Но есть способ принудительного закрытия PreviewController. В этом случае вызывается только метод 4, и PreviewController освобождается до того, как UISplitViewController может отправить сообщение и позвонить по методу 2.

Как решить эту проблему? Есть ли способ заставить UISplitViewController назвать метод делегата? Или я могу сохранить PreviewController в методе 4 и отпустить его в методе 2 (используя ARC)?

// Method 1 
- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    self.hideMaster = YES; 
    UISplitViewController *splitViewController = [(AppDelegate *)[[UIApplication sharedApplication] delegate] splitViewController]; 
    splitViewController.delegate = self; 
} 

// Method 2 
- (BOOL)splitViewController:(UISplitViewController *)svc shouldHideViewController:(UIViewController *)vc inOrientation:(UIInterfaceOrientation)orientation 
{ 
    return self.hideMaster; 
} 

// Method 3 
- (void)viewWillAppear:(BOOL)animated 
{ 
    self.hideMaster = YES; 
    UISplitViewController *splitViewController = [(AppDelegate *)[[UIApplication sharedApplication] delegate] splitViewController]; 
    [splitViewController.view setNeedsLayout]; 
    [splitViewController willRotateToInterfaceOrientation:self.interfaceOrientation duration:0]; 
} 

// Method 4 
- (void)viewWillDisappear:(BOOL)animated 
{ 
    self.hideMaster = NO; 
    UISplitViewController *splitViewController = [(AppDelegate *)[[UIApplication sharedApplication] delegate] splitViewController]; 
    [splitViewController.view setNeedsLayout]; 
    [splitViewController willRotateToInterfaceOrientation:self.interfaceOrientation duration:0]; 
} 

// PreviewController is created in UIViewController which belongs to UINavigationController 
PreviewController *previewVC = [[PreviewController alloc] initWithNibName:@"PreviewController" bundle:nil]; 
previewVC.documentURL = url; 
[self.navigationController pushViewController:previewVC animated:YES] 
+0

Где и как создается экземпляр PreviewController? Можете ли вы опубликовать код для этого? – Leijonien

+0

Добавил эту информацию в раздел вопросов. – GxocT

ответ

1

В настоящее время вы не имеете ссылки на экземпляр PreviewController. Это должно быть достаточно, чтобы добавить сильное свойство класса в интерфейсе:

@property (nonatomic, strong) PreviewController *previewVC; 

А затем создать экземпляр с помощью:

self.previewVC = [[PreviewController alloc] initWithNibName:@"PreviewController" bundle:nil]; 

Это обеспечивает PreviewController не будет удален, пока ваш контроллер мнения живой (если вы не отпустите его самостоятельно).

+0

Ты помог мне частично. PreviewVC не освобождается, но метод делегирования еще не вызван. :( – GxocT

+0

Я нашел решение. Я добавил splitViewController.delegate = self, в методе # 4. Делегирование для splitViewController было изменено в другом UIViewController, поэтому он не был вызван :( – GxocT

Смежные вопросы