【问题标题】:Presenting view controllers on detached view controllers is discouraged - screen view turns black不鼓励在分离的视图控制器上显示视图控制器 - 屏幕视图变黑
【发布时间】:2016-03-25 07:54:04
【问题描述】:

我有两个视图控制器:VC1 和 VC2。在 VC1 中,按一个按钮会将应用程序导航到 VC2。 VC2 在 vi​​ewDidLoad() 中有一个网络请求函数,如果请求失败,它会显示警报。

如果一切正常,VC2 上没有请求失败,当我回到 VC1 时,它会调用 VC2 的 deinit 函数。

但是,如果请求失败并显示错误警报,则当我移回 VC1 时将不会调用(VC2 的)deinit 函数。此外,当它试图在屏幕显示 VC1 后显示该警报时,它会导致 “不鼓励在分离的视图控制器上显示视图控制器”的错误,然后屏幕变为黑色,除了导航栏和错误警报VC2 显示在 VC1 上(原因是当 VC2 将要显示错误警报时,用户突然按下导航栏上的后退按钮返回到上一个屏幕)。我的警报是一个全局变量。

这是我处理请求并在 VC2 上显示警报的代码:

func sendRegisterRequest() {
    registerAPI.request(parameters: parameters) {
        [weak self] (response) in

        if let strongSelf = self {
            strongSelf.handleResponse(response)
        }
    }
}

func handleResponse(response: Response<AnyObject, NSError>) {
    let result = ResponseHandler.responseHandling(response)

    if result.messageCode != MessageCode.Success {
        // Show alert
        handleResponseError(LocalizedStrings.registerFailedTitle, message: result.messageInfo, requestType: .Register)
        return
    }
}

func handleResponseError(title: String, message: String?, requestType: RequestType?) {
    alert = UIAlertController(title: title, message: message, preferredStyle: .Alert)
    let action = UIAlertAction(title: LocalizedStrings.okButton, style: UIAlertActionStyle.Default) { (action) -> Void in
        self.handleAlertViewAction(requestType)
    }

    alert.addAction(action)

    dispatch_async(dispatch_get_main_queue(), {
        self.presentViewController(self.alert, animated: true, completion: nil)
    })
}

我在这里附上截图:

有人能解决这个问题吗?任何帮助都将不胜感激,

露西·阮。

【问题讨论】:

  • 请添加一些代码以便更好地理解...
  • 为什么要调用 deinit 函数
  • 我认为您在 VC2 上显示警报,然后关闭 VC2。您应该在点击 OK 按钮时关闭 VC2。或者您应该关闭 VC2,然后显示警报
  • 显示的警报取决于请求结果。而当 VC2 将要显示警报时,用户突然按下导航栏上的后退按钮返回到上一个屏幕。这会导致此错误。
  • 我调用 deinit 函数来了解 VC2 是否得到 deinit,如果是则释放警报。让我添加一些代码。

标签: ios swift mobile


【解决方案1】:

我在构建应用程序时遇到了同样的问题。为了解决这个问题,我尝试了很多修改,最后删除了错误信息。

我在第一个 VC 中创建了一个警报窗口,以通知用户。我在- (void)viewDidLoad 中编写了警报控制代码。我认为您也这样做了,或者在- (void)viewWillAppear 中这样做了。

只需将您的警报代码移至- (void)viewDidAppear。然后,错误就会消失。

【讨论】:

    猜你喜欢
    • 2013-11-22
    • 2018-02-21
    • 1970-01-01
    • 2015-01-25
    • 1970-01-01
    • 1970-01-01
    • 2017-02-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多