簡體   English   中英

如何彈出viewController,然后通過委托推送viewController

[英]How to pop a viewController and then Push a viewController through delegation

我有一個UITableViewController,當按下一個單元格時,我希望控制器彈出自己,然后將控制器彈出,將另一個視圖控制器推入堆棧。

我正在調用此方法,因為popped-to viewController是tableViewController的委托

我目前正在調用此方法並延遲它,因為否則,一切都搞砸了等待動畫結束。 這樣做似乎有點hacky,在我看來,如果有人的設備沒有在我給出的分配的等待時間內彈出視圖,它會失敗。

以下是一些代碼:

//**** code in my tableViewController ***//

[self.navigationController popViewControllerAnimated:YES];
[self.delegate cellPressedInTableViewControllerWithCalculationsModel:(id)anArgmentMyDelegateMethodTakes];



// **** Code in the viewController being popped to ****//
//CalculationsViewController is a subclass of UIViewController
CalculationsViewController *calcViewController = [[CalculationsViewController alloc] init];

//some customization code would go her

[self.navigationController performSelector:@selector(pushViewController:animated:) withObject:calcViewController afterDelay:0.75];
//this seems like the arbitrary part, the 0.75 second delay.

[calcViewController release];

似乎應該有更好的方法來彈出/推送將在動畫結束后執行的委托。 在我看來,等待時間可能會導致意外問題。

我也試過用:

 performSelectorOnMainThread:withObject:waitUntilDone

但代碼只是立即執行,視圖層次結構搞砸了。

我也看過這個問題: 代表團問題 ,它讓我這么做,但我很想知道是否有更好的方法來執行這樣的任務,謝謝。

編輯:我也嘗試在NSInvocation的實例中包裝該方法,我無法讓它協調方法調用,直到動畫完成后沒有任意設置延遲

除了單個push或pop視圖控制器之外,最簡潔的方法是設置UINavigationController的視圖控制器數組。

例如,彈出然后推送視圖控制器:

MyTableViewController *vc = [[MyTableViewController alloc] init];

NSMutableArray *controllers = [NSMutableArray arrayWithArray:self.navigationController.viewControllers];
[controllers removeLastObject];
[controllers addObject:vc];

[self.navigationController setViewControllers:controllers animated:YES];

你應該使用一面旗幟來克服這種情況。 您在視圖控制器的viewWillDisappear方法中設置此標志。 設置此標志然后您可以在堆棧上推送另一個視圖控制器。 希望很清楚。

當您解除包含表的UIViewController時,如何在viewDidDisappear方法中發送NSNotifcation,如下所示:

- (void)viewDidDisappear:(BOOL)animated
{
    [[NSNotificationCenter defaultCenter] postNotificationName:@"loadOtherVC" object:nil];
}

在將推送新視圖控制器的父視圖控制器中,您為該通知添加一個觀察者,如下所示:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(LoadOtherVC:) name:@"loadOtherVC" object:nil];

你應該有一個匹配選擇器的方法。

- (void) LoadOtherVC:(NSNotification *) notification
{
    // load your other view controller you want here
}

我喜歡Alexandre的解決方案,但如果我是代理人,我不想使用通知。 所以在這種情況下,我們可以在viewDidDisappear方法中使用委托。

因此,在didSelectRowAtIndexPath方法中,您可以彈出控制器 -

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
     [self.navigationController popViewControllerAnimated:YES];
}

在同一個View Controller中,你彈出的ViewController,在viewDidDisappear方法中調用委托方法,如 -

-(void)viewDidDisappear:(BOOL)animated{
   [self.delegate cellPressedInTableViewControllerWithCalculationsModel:(id)anArgmentMyDelegateMethodTakes];
}

然后在推送的控制器中可以實現委托方法並在該委托方法中,您可以做任何你想做的事情。

不要從頂級控制器彈出它。 調用委托方法,該方法將從導航控制器中彈出視圖,然后再打開一個新方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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