簡體   English   中英

調用performSeguewithIdentifier不會調用應該執行seguewithIdentifier

[英]Calling performSeguewithIdentifier doesn't call shouldperformseguewithIdentifier

我有兩個視圖控制器。 在視圖controller1上,我有以下內容:

  • 將我帶到viewcontroller2的segue-此segue名為“ showme”,並附加到viewcontroller
  • UIButton的IBAction

在我的代碼中,按鈕按下操作具有以下內容

@IBAction func buttonPress(sender: AnyObject) {
    println("button pressed")
        performSegueWithIdentifier("showme", sender: self)
}

我也有以下方法:

override func shouldPerformSegueWithIdentifier(identifier: String?, sender: AnyObject?) -> Bool {
    println("Should performing....")
    return true
}   

由於某些原因,從不調用shouldPerformSegueWithIdentifier函數。 但是,如果我直接在UIButton上將segue添加到ViewController2。

我已經確認在按鈕操作中將其稱為“方向”是可行的(請參見下文),但這不是我所理解的那樣。 prepareforSegue也是如此。

@IBAction func buttonPress(sender: AnyObject) {
    println("button pressed")
    if (shouldPerformSegueWithIdentifier("showme", sender: self)){
        performSegueWithIdentifier("showme", sender: self)}
} 

此行為是完全自然的,原因如下:

1) shouldPerformSegueWithIdentifier用於確保應該觸發在情節提要中設置的segue,因此僅在情節提要Segues的情況下才調用它,並且使您有機會實際執行此segue。

2)當你調用performSegueWithIdentifier自己, shouldPerformSegueWithIdentifier 叫,因為它可以假設你知道你在做什么。 調用performSegueWithIdentifier毫無意義,但是從shouldPerformSegueWithIdentifier返回NO

@nburk的答案是絕對正確的。

但是我知道,在某些情況下,無論如何都應該調用shouldPerformSegueWithIdentifier:sender:可能也是有用的,而且在代碼中對performSegueWithIdentifier:sender:的調用也是如此。

例如,我們要進行一些驗證來決定是否執行序列,並且希望將此邏輯保留在單個位置,而不是像以下那樣在所有位置條件下重復:

if (self.shouldPerformSegue) {
     [self performSegueWithIdentifier:identifier sender:sender];
}

可以很容易地通過覆蓋performSegueWithIdentifier:sender:來實現,如下所示:

- (void)performSegueWithIdentifier:(NSString *)identifier sender:(id)sender
{
    if ([self shouldPerformSegueWithIdentifier:identifier sender:sender]) {
        [super performSegueWithIdentifier:identifier sender:sender];
    }
    // otherwise do nothing
}

- (BOOL)shouldPerformSegueWithIdentifier:(NSString *)identifier sender:(id)sender
{
    return self.shouldPerformSegue;
}

這樣,您可以使用shouldPerformSegueWithIdentifier:sender:定義允許/拒絕IB和代碼觸發的序列的邏輯。

作為上面的答案。 如果調用performSegueWithIdentifier shouldPerformSegueWithIdentifier調用shouldPerformSegueWithIdentifier

舉個例子:

假設您在容器視圖中有一個嵌入式segue,以便顯示一些可以滑動的圖像。 當您加載VC時,嵌入式segue會立即被觸發。 但是,如果您必須從遠程API下載圖像,則由於嵌入的segue / container視圖中不會顯示任何圖像,因此應用程序將崩潰。

在這種情況下,將需要shouldPerformSegueWithIdentifier

您可以設置一個布爾值,如果它的false返回false並且不會觸發您的segue, shouldPerformSegueWithIdentifiershouldPerformSegueWithIdentifier檢入。 一旦您的應用下載了圖像,就可以調用performSegueWithIdentifier

如果您正在使用此代碼,則需要刪除;

[self performSegueWithIdentifier:name sender:sender];

感謝@tanzolone提供完美的解決方案。 Swift 5上重寫代碼。

要大力呼吁shouldPerformSegue之前performingSegue ,您可以覆蓋performingSegue在你的類:

override func performSegue(withIdentifier identifier: String, sender: Any?) {
    if shouldPerformSegue(withIdentifier: identifier, sender: sender) {
        super.performSegue(withIdentifier: identifier, sender: sender)
    }
}

override func shouldPerformSegue(withIdentifier identifier: String, sender: Any?) -> Bool {
    // Your code (return true if you want to perform the segue)
}

暫無
暫無

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

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