2015-03-31 43 views
0

問題涉及AddItemView,它由其代表以模態方式呈現幷包含tableView。當用戶從tableView中選擇一個項目時,它會觸發代表的操作。根據服務器的響應,委託人可以在當前模態之上顯示另一個模態視圖或UIAlertView。從當前模態的代表出現UIAlertView

重要說明:需要在模態仍在屏幕上時顯示此UIAlertView。包含tableView的模態表示不能在用戶選擇後被解散,因爲用戶需要能夠從表中選擇多個項目,並逐個將它們發回給委託進行處理。

目前,UIAlerView沒有被顯示,我懷疑這是因爲已經呈現的模態正在阻止這種情況。當委託人坐在模式下並且沒有駁回該模式時,是否有解決方法來向代表提供UIAlertView?

的UIAlertView中目前由代表顯示像這樣,而委託坐在一個模式下:

var alert = UIAlertController(title: "Error", message: "Error message from server", preferredStyle: UIAlertControllerStyle.Alert) 

    alert.addAction(UIAlertAction(title: "actionOne", style: .Default, handler: { action in 
    // perform some action 

    })) 

    alert.addAction(UIAlertAction(title: "actionTwo", style: .Destructive, handler: { action in 
    // perform some action 

    })) 

    self.presentViewController(alert, animated: true, completion: nil) 

這裏是當UIAlertView中由代表介紹時返回的錯誤:

Warning: Attempt to present <UIAlertController: 0x156da6300> on <productionLINK_Scanner.ContainerContents: 0x156e65b20> whose view is not in the window hierarchy! 

如果可能,請使用Swift提供答案。

+0

在控制器生命週期中的哪個位置,您是否嘗試顯示警報控制器?將控制器呈現在另一個之上沒有問題。另外,您不需要關閉處理程序中的警報控制器,它會自動解除。 – 2015-03-31 16:24:10

+0

@LeoNatan當用戶在顯示的模式的tableView中選擇一行時,UIAlertView將從委託中顯示。需要注意的是,模態表示的tableView(它實際上是嵌入在UIView中的tableView)需要保留在屏幕上 - 它不能被解散,因爲用戶需要能夠從表中選擇多個項目並將它們發回給代表。 – 2015-03-31 18:34:20

回答

1

解決

用下面的擴展,這要歸功於yonat在GitHub上:

extension UIApplication { 

    class func topViewController(base: UIViewController? = UIApplication.sharedApplication().keyWindow?.rootViewController) -> UIViewController? { 
     if let nav = base as? UINavigationController { 
      return topViewController(base: nav.visibleViewController) 
     } 
     if let tab = base as? UITabBarController { 
      if let selected = tab.selectedViewController { 
       return topViewController(base: selected) 
      } 
     } 
     if let presented = base?.presentedViewController { 
      return topViewController(base: presented) 
     } 
     return base 
    } 
} 

在有問題的代表,它是實現像這樣:

var alert = UIAlertController(title: "Alert Title", message: "Message Body", preferredStyle: UIAlertControllerStyle.Alert) 

alert.addAction(UIAlertAction(title: "OK", style: .Default, handler: { action in 

})) 

if let topController = UIApplication.topViewController(base: self) { 
    topController.presentViewController(alert, animated: true, completion: nil) 

} else { 
    // If all else fails, attempt to present the alert from this controller. 
    self.presentViewController(alert, animated: true, completion: nil) 

} 

這現在允許以下過程:

  1. ContainerView加載爲ItemTableView
  2. 用戶的委託點擊searchButton
  3. ContainerView模態呈現項目ItemTableView
  4. 每次使用選擇在ItemTableView一排列表,則didSelectItem函數被調用的顯示ItemTableViewContainerView的實例。 ItemTableView不會被解僱 - 用戶可以繼續選擇項目。
  5. ContainerView向服務器提交請求
  6. 根據響應,ContainerView可能會顯示UIAlertView
  7. alertView使用上述代碼在層次結構中最上方的任何視圖之上正確顯示。
0

「當用戶選擇一個項目時,它觸發並在委託動作」

在其通過選擇一個項目觸發委託方法的開始設置一個斷點。檢查該委託方法是否被調用?

並測試。 (ACTION :UIAlertAction!)in