簡體   English   中英

在調用委托方法之前,將UIViewController釋放了

[英]UIViewController is deallocated before delegate method is called

我有PreviewControllerUIViewController ,用於全屏顯示文檔,它是UINavigationViewController的一部分。 也是UISplitViewController的委托。

推送時,它將隱藏masterViewUISplitViewController (調用方法1-3-2)

當它消失時(通過按“后退”按鈕),它顯示masterViewUISplitViewController (調用方法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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM