[英]UIViewController viewDidLoad called before init method is complete
[英]UIViewController is deallocated before delegate method is called
我有PreviewController
: UIViewController
,用於全屏顯示文檔,它是UINavigationViewController
的一部分。 也是UISplitViewController
的委托。
推送時,它將隱藏masterView
的UISplitViewController
。 (調用方法1-3-2)
當它消失時(通過按“后退”按鈕),它顯示masterView
的UISplitViewController
。 (調用方法4-2)
但是有一種方法可以強制關閉PreviewController
。 在這種情況下,在UISplitViewController
可以發送消息並調用方法2之前,僅方法4被調用並且PreviewController
被釋放。
我該如何解決這個問題? 有沒有一種方法可以強制UISplitViewController
調用它的委托方法? 還是可以在方法4中保留PreviewController
並在方法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]
當前,您沒有對PreviewController實例的任何強引用。 在界面中添加一個強大的類屬性就足夠了:
@property (nonatomic, strong) PreviewController *previewVC;
然后使用以下方法創建實例:
self.previewVC = [[PreviewController alloc] initWithNibName:@"PreviewController" bundle:nil];
這樣可以確保在您的視圖控制器處於活動狀態時,不會取消釋放PreviewController(除非您自己釋放它)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.