簡體   English   中英

ViewController不會關閉

[英]ViewController WILL NOT dismiss

    WLINewPostViewController *newPostViewController = [[WLINewPostViewController alloc] initWithNibName:@"WLINewPostViewController" bundle:nil];
    UINavigationController *newPostNavigationController = [[UINavigationController alloc] initWithRootViewController:newPostViewController];
    newPostNavigationController.navigationBar.translucent = NO;
    [tabBarController presentViewController:newPostNavigationController animated:YES completion:nil];

因此,我只是簡單地推送一個新的UIViewController。 然后,在服務器回調發布后,從WLINewPostViewController.m使用以下代碼調用方法:

[self dismissViewControllerAnimated:YES completion:^{
                    NSLog(@"Completed");
                }];

                [[self navigationController] popViewControllerAnimated:YES];

                if (self == self.navigationController.visibleViewController){
                    NSLog(@"self = visibile");
                }

                if (self == self.presentingViewController.presentingViewController){
                    NSLog(@"self = presenting");
                }

            }

我嘗試了一堆不同的方法,但沒有任何效果。 我對Xcode比較陌生,但是嘗試之后

[self dismissViewControllerAnimated:YES completion]
[self.navigationController popViewControllerAnimated:YES]
[self.navigationController.visibleViewController.presentedViewController dismissViewControllerAnimated:YES completion:nil];
[self.navigationController dismissViewControllerAnimated:YES completion:nil];

以及其他所有可能性,我被正式絆倒了。 WLINewPostViewController仍然不會關閉。

它注銷“ self = visible”

讓我說明一下你想做什么

您有一個帶有Controller A的導航控制器。在這里,您嘗試從Controller A呈現另一個ControllerB。現在,當從服務器獲取回調時,應該從Controller B調用dismissViewControllerAnimated來關閉自身。

因此,在調用dismissViewControllerAnimated:completion:方法之后,將關閉控制器B,並自動顯示控制器A。 現在,您無需再次在完成塊中調用popViewControllerAnimated :,因為導航控制器中沒有其他要加載的Controller。

如果您有不同的用例,請告訴我可以提供解決方案。

您是在導航欄上顯示視圖,而不是在導航欄上推視圖。

按下時彈出。 當您出席時,您將被解雇。 因此,您需要使用dismissViewControllerAnimated:completion代替popViewControllerAnimated

根據接收者的不同,解雇的行為也有所不同。 從文檔:

呈現視圖控制器負責解散其呈現的視圖控制器。 如果在顯示的視圖控制器本身上調用此方法,它將自動將消息轉發到顯示的視圖控制器。

如果您連續顯示幾個視圖控制器,從而構建一個顯示的視圖控制器堆棧,則在堆棧中較低的視圖控制器上調用此方法將取消其直接子視圖控制器以及該堆棧上該子視圖之上的所有視圖控制器。 發生這種情況時,只有最上面的視圖會以動畫方式關閉; 只需從堆棧中刪除所有中間視圖控制器即可。 最頂層的視圖使用其模式過渡樣式來消除,該樣式過渡樣式可能與堆棧中較低的其他視圖控制器使用的樣式不同。

簡而言之,如果最上面的vc對其本身進行調用,則將其自身關閉。 到此為止,堆棧上的其他任何地方都不會激活,僅使最頂層的vc動畫。

(對您和其他許多人而言),另外一個令人困惑的地方是導航vc也具有堆棧,並且通過在選項卡vc的頂部顯示導航vc進一步使您的問題變得更加復雜。

那么該怎么辦? 問題尚不清楚發布代碼中的接收方是哪個vc(該代碼段中的誰是self ?)。 文字暗示self是顯示的導航vc堆棧上的vc,例如...

TabBarVC  --- presents ---> NavVC
 |                            | 
 |                            --- viewControllers stack = rootVC, vc1
 |
 ---> viewControllers for each tab

...並且它是要關閉的root或vc1。 如果我對此表示正確,那么給定文檔,解決方案很明確:

[self.navigationController dismissViewControllerAnimated:YES completion:^{}];

將使我們回到執行當前操作時可見的選項卡上的選項卡vc。

暫無
暫無

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

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