菜鸟教程小白 发表于 2022-12-11 21:47:55

ios - 如何从委托(delegate)方法启动 UIAlertController?


                                            <p><p>我的代码非常基础。我有 2 个 ViewController 。在名为“FirstScreen”的第一个 viewController 上有一个按钮,通过模态 segue 将我带到第二个屏幕,那里还有一个按钮。 “SecondScreen”有一个带有 1 方法的协议(protocol),“FirstScreen”符合该协议(protocol)。所以基本上我试图从该方法调用 <code>UIAlertController</code>,同时按下“SecondScreen”的按钮。结果我得到:</p>

<blockquote>
<p>&#34;Warning: Attempt to present.....on....whose view is not in the window
hierarchy!</p>
</blockquote>

<p>我知道我可以在我的 Storyboard 中嵌入一个导航 Controller 并且警报会起作用,但对我来说不是这样。我也想以这种方式调用警报,因为需要知道 <code>CLAuthorizationStatus</code>。<br/></p>

<blockquote>
<p><strong>So maybe is there any way of getting the status directly from the
&#34;SecondScreen&#34; ?</strong></p>
</blockquote>

<pre><code>import UIKit
import CoreLocation

class FirstScreen: UIViewController {

    @IBAction func firstTapped(_ sender: UIButton) {
      let selectionVC = storyboard?.instantiateViewController(withIdentifier: &#34;secondVC&#34;) as! SecondScreen
      present(selectionVC, animated: true, completion: nil)
      selectionVC.delegate = self
    }
}

extension FirstScreen: LocationPermissionDelegate {

    func checkLocationStatus() {

      let status = CLLocationManager.authorizationStatus()
      if status == CLAuthorizationStatus.notDetermined {

            let alert = UIAlertController(title: &#34;Just a message&#34;, message: &#34;HEYYY!&#34;, preferredStyle: .alert)
            let action = UIAlertAction(title: &#34;Dismiss&#34;, style: .default, handler: nil)
            alert.addAction(action)
            present(alert, animated: true)
      }
    }
}

import Foundation
import UIKit

protocol LocationPermissionDelegate {
    func checkLocationStatus()
}

class SecondScreen: UIViewController {

    var delegate: LocationPermissionDelegate?

    @IBAction func secondTapped(_ sender: UIButton) {

      delegate?.checkLocationStatus()
    }
}
</code></pre></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>firstvc目前正在展示</p>

<pre><code>present(selectionVC, animated: true, completion: nil)
</code></pre>

<p>所以你不能在这里显示警报</p>

<pre><code>present(alert, animated: true)
</code></pre>

<p>移动这个</p>

<pre><code>func checkLocationStatus() {

    let status = CLLocationManager.authorizationStatus()
    if status == CLAuthorizationStatus.notDetermined {

      let alert = UIAlertController(title: &#34;Just a message&#34;, message: &#34;HEYYY!&#34;, preferredStyle: .alert)
      let action = UIAlertAction(title: &#34;Dismiss&#34;, style: .default, handler: nil)
      alert.addAction(action)
      present(alert, animated: true)
    }
}
</code></pre>

<p>到第二个vc,在那里做演示</p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 如何从委托(delegate)方法启动 UIAlertController?,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/54275477/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/54275477/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 如何从委托(delegate)方法启动 UIAlertController?