Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/115.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
IOS Swift处理全球事件_Ios_Swift_Cocoa Touch_Events - Fatal编程技术网

IOS Swift处理全球事件

IOS Swift处理全球事件,ios,swift,cocoa-touch,events,Ios,Swift,Cocoa Touch,Events,我如何处理通知中心触发的全局事件(例如,在我的API class I中),如果收到错误响应(例如,(500),则会触发事件。触发该事件时,应在任何视图控制器处于活动状态时显示UIAlert,或在注销时显示登录视图控制器 就我所见,没有简单的方法可以获取当前视图控制器以便与之交互。(请注意,我的根视图控制器不是导航控制器)。这种方式是否太难获取当前视图控制器(不使用导航控制器时) 用于广播通知 NSNotificationCenter.defaultCenter().postNotificatio

我如何处理通知中心触发的全局事件(例如,在我的API class I中),如果收到错误响应(例如,(500),则会触发事件。触发该事件时,应在任何视图控制器处于活动状态时显示UIAlert,或在注销时显示登录视图控制器


就我所见,没有简单的方法可以获取当前视图控制器以便与之交互。(请注意,我的根视图控制器不是导航控制器)。

这种方式是否太难获取当前视图控制器(不使用导航控制器时)


用于广播通知

NSNotificationCenter.defaultCenter().postNotificationName("erro400", object: nil)
用于接收

override func viewWillAppear(animated: Bool) {
NSNotificationCenter.defaultCenter().addObserver(self, selector: "ErroOccure", name: "erro400", object: nil)
}

func ErroOccure()
{
    //present alert from here
   // do whatever you want
}
完成通知后,必须将其删除

override func viewWillDisappear(animated: Bool) {
    NSNotificationCenter.defaultCenter().removeObserver(self)
}

另一种解决方案是子类化
UIViewController
,无论视图控制器是否嵌入在
UINavigationController
中,都可以使用。此类将处理接收发生错误的
NSNotification
,还将处理显示警报:

class MyViewController: UIViewController {
    override func viewWillAppear(animated: Bool) {
        super.viewWillAppear(animated)
        NSNotificationCenter.defaultCenter().addObserver(self,
                                             selector: "errorOccured",
                                             name: "ErrorNotification",
                                             object: nil)
    }

    override func viewWillDisappear(animated: Bool) {
        super.viewWillDisappear(animated)
        NSNotificationCenter.defaultCenter().removeObserver(self, name: "ErrorNotification", object: nil)
    }

    func errorOccured() {
        // Present an UIAlertViewController or the login screen.
    }
}

现在,任何在发布错误通知时应显示警报的
UIViewController
s必须是
MyViewController
的子类。只需确保,如果覆盖
视图将出现
视图将消失
,则称为
超级。视图将出现
超级。视图将消失

,这似乎可行,但我猜如果其中一个视图控制器是导航控制器,可能会出问题。“有没有更好的方法来实现我的目标?”本·霍克查看编辑后的答案。我认为这将解决仅使用导航控制器、完全不使用导航以及在不同场景中将导航与视图控制器组合时的问题。如果这看起来不错,您是否同意这是处理类似问题的正确方法?例如,以最简单的形式是。否则,如果你在应用程序中应用任何类型的架构,它可能会违反它。我认为我宁愿设计应用程序来避免这种事情。当您使用不同的自定义视图时,也会变得更加复杂。请尝试使用NSNotificationCenter我确实使用NSNotification来广播/观察事件。只是我不确定如何处理诸如在活动视图控制器上显示警报之类的事情。除了问题之外,我所拥有的几乎就是,这需要在所有视图控制器中处理。例如,如果在主页上获得500,则应显示警报,但在设置页面、配置文件页面等上也应显示警报。因此,它需要全局处理,查找活动视图控制器并在其上显示警报。您需要在使用网络通信的所有视图控制器上执行此操作。我们正在寻找一种方法让他知道,我已经回答了,因为他说他不知道如何处理通知。这是一个比其他人更好的答案。这样,ViewController负责视图,而不是您的模型告诉它该做什么。
class MyViewController: UIViewController {
    override func viewWillAppear(animated: Bool) {
        super.viewWillAppear(animated)
        NSNotificationCenter.defaultCenter().addObserver(self,
                                             selector: "errorOccured",
                                             name: "ErrorNotification",
                                             object: nil)
    }

    override func viewWillDisappear(animated: Bool) {
        super.viewWillDisappear(animated)
        NSNotificationCenter.defaultCenter().removeObserver(self, name: "ErrorNotification", object: nil)
    }

    func errorOccured() {
        // Present an UIAlertViewController or the login screen.
    }
}