簡體   English   中英

iOS - 展開我的初始視圖控制器

[英]iOS - unwind to my initial view controller

我正在使用展開segue來展開我的故事板中的初始視圖控制器。 展開效果很好,我在初始視圖控制器中實現了這個方法:

- (IBAction) unwindToInitialViewController:(UIStoryboardSegue *) unwindSegue {

}

但是,如果我在展開后嘗試使用segue到另一個視圖控制器,我會收到以下錯誤:

警告:嘗試顯示其視圖不在窗口層次結構中!

看起來這只有在我放松到故事板中被檢查為“初始視圖控制器”的視圖控制器時才會出現。 這是一個錯誤嗎? 我應該能夠放松到初始控制器嗎? 其他想法?

編輯:

以下是我執行第二個segue的方法:

[self performSegueWithIdentifier:@"mySegue" sender:nil];

我應該注意這是一個登錄/注銷問題。 當我第一次登錄從登錄控制器到下一個控制器的segue工作時。 當我退出時,我放松到初始視圖控制器。 然后我再次登錄,從我的登錄控制器到下一個控制器的segue不起作用。

編輯2:

從更多的研究中我找到了它,因為我正在使用代表登錄。 登錄是異步的,我用AFNetworking打電話,當它完成后我調用我的登錄委托(在這種情況下登錄VC)。 此時,登錄VC可以轉到視圖。

登錄代碼:

- (void) login: (NSDictionary *) parameters {
    [http.manager POST:url parameters:parameters success:^(AFHTTPRequestOperation *operation, NSDictionary *response) {
       [self.loginDelegate loginSuccess:response]; 
    } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
       [self.loginDelegate loginFailure:error]; 
    }];
}

我的登錄名VC是委托人:

- (void) loginSuccess:(NSDictionary *) response {
    // setup user info based on response
    ...
    // Segue 
    [self performSegueWithIdentifier:@"loginSuccessSegue" sender:nil];
}

我已經檢查過我是主線程的時候和我一起但仍然沒有運氣。 我知道AFNetworking總是調用主線程上的成功/失敗塊。

棘手的部分。 如果我將上面的代碼更改為使用塊而不是委托,則storyboard / segue不會搞砸,我可以多次登錄和注銷,沒有任何問題。

為什么segue第一次使用委托模式,但在注銷(展開)時,我不能再使用那個segue嗎?

編輯3:

更多調查顯示,在展開我的登錄VC viewDidAppear被調用兩次。 在初始展開時,視圖仍然在堆棧中,顯示它快速顯示並調用viewDidAppear。 然而,這很快就會被動畫化,而viewWillAppear會被另一個VC稱為第二次。 我認為這可能是問題的根源。 為什么當我放松到那個VC的時候,它的動畫效果只會被動畫回來?

在第二次登錄嘗試期間,請檢查您的loginDelegate是否為nil 如果它是nil ,“代表電話”將無處可去。 另請檢查loginDelegate是否指向您期望的實例。 如果它指向“舊”實例,則可能嘗試呈現錯誤的視圖。

可以以意想不到的順序調用viewDidLoadviewDidAppearviewWillAppear等方法集,尤其是在返回導航或呈現廣告並從中返回時。 如果您在這些方法之間分配了不同的初始化/設置任務,則最終可能會使用部分初始化的視圖控制器。

(考慮到這個問題,我失去了關於遇到的錯誤的陳述,所以代表可能不是零。)

編輯:

我運行了一個小的展開測試項目並記錄了viewDidAppear調用:

viewDidAppear: <ViewController: 0x7a687700>
viewDidAppear: <VC2: 0x7a70e970>
viewDidAppear: <VC3: 0x7a694d50>
unwind target
viewDidAppear: <VC2: 0x7a70e970>
viewDidAppear: <ViewController: 0x7a687700>
viewDidAppear: <VC2: 0x7a71b790>
viewDidAppear: <VC3: 0x7a694d20>
unwind target
viewDidAppear: <VC2: 0x7a71b790>
viewDidAppear: <ViewController: 0x7a687700>

VC3簡要顯示VC2並最終到達目標ViewController 現在第二個“登錄”導致視圖控制器的不同實例。

你是否保留對“舊”視圖控制器的引用?

另一個原因可能是,您的“注銷”檢測會觸發兩次(一次是在放松時,另一次是在中間或初始視圖控制器檢測到需要登錄時?)。

暫無
暫無

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

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