如何在不重复代码的情况下在所有控制器中显示警报?

Posted

技术标签:

【中文标题】如何在不重复代码的情况下在所有控制器中显示警报?【英文标题】:How to show alert in all controllers without repeating the code? 【发布时间】:2015-12-10 07:54:27 【问题描述】:

我想编写一个函数alert() 并运行它。但我想在任何控制器中显示此警报而不重复代码。

例如:我有 Presence.swift 类,在这里我有一些条件,如:

if myVar == 1  // Just for presenting
    runMyAlert()

当在后台myVar == 1用户时,无论他在哪里,在哪个屏幕上,他都会在屏幕上得到警报。

如何在不重复代码的情况下做到这一点?我试图在 AppDelegate 中将其设置为:

func alert(title : String,message : String,buttonTitle : String,window: UIWindow)
    let alert = UIAlertController(title: title, message: message, preferredStyle: UIAlertControllerStyle.Alert)
    alert.addAction(UIAlertAction(title: buttonTitle, style: UIAlertActionStyle.Default, handler: nil))
    window.rootViewController?.presentViewController(alert, animated: true, completion: nil)

并将其称为:

if myVar == 1 
    AppDelegate().alert()

【问题讨论】:

您可以编写一些代码来获取当前的顶视图控制器,然后您可以从任何地方呈现它....rootViewController 与您当前的顶视图控制器不同 【参考方案1】:

Swift 上开发您应该了解可以轻松解决您问题的协议。您可以创建一个新协议MyAlert 并为UIViewController 类进行默认实现。然后在视图控制器中继承你的MyAlert 协议,在你需要的地方,调用函数!

protocol MyAlert 
    func runMyAlert()


extension MyAlert where Self: UIViewController 
    func runMyAlert() 
        let alert = UIAlertController(title: title, message: "message", preferredStyle: UIAlertControllerStyle.Alert)
        alert.addAction(UIAlertAction(title: "buttonTitle", style: UIAlertActionStyle.Default, handler: nil))
        self.presentViewController(alert, animated: true, completion: nil)
    

所以你可以这样实现和调用它:

class MyViewController: UIViewController, MyAlert 
    override func viewDidLoad() 
        runMyAlert() // for test
    

更新:

您的案例代码:

protocol MyAlert 
    func runMyAlert()


extension MyAlert where Self: UIViewController 
    func runMyAlert() 
        let alert = UIAlertController(title: title, message: "message", preferredStyle: UIAlertControllerStyle.Alert)
        alert.addAction(UIAlertAction(title: "buttonTitle", style: UIAlertActionStyle.Default, handler: nil))
        self.presentViewController(alert, animated: true, completion: nil)
    


class OpenChatsTableViewController: UITableViewController, MyAlert, OneRosterDelegate, BuddyRequestProtocol 
    override func viewDidLoad() 
        runMyAlert()
    

【讨论】:

我收到下一个错误:Type 'ViewController' does not conform to protocol 'MyAlert' 显示你的代码,也许你忘了继承UIViewController为你的ViewController 这是我使用此协议的课程:class OpenChatsTableViewController: UITableViewController, OneRosterDelegate, BuddyRequestProtocol 我还将这行代码 extension MyAlert where Self: UIViewController 修改为 extension MyAlert where Self: UITableViewController @OrkhanAlizade 不要修改它,UITableViewController 继承 UIViewController @OrkhanAlizade 这是因为在协议中您声明了showBuddyRequest(),而在扩展中您实现了showBuddyRequest(fromUser: String) - 这是两个不同的功能。希望,你知道如何解决它。在我的示例中,有 2 个具有相同参数的相同函数【参考方案2】:

在 UIViewController 上创建一个类别,在那里写一个方法,调用哪个应用会显示一个警告框。

现在创建一个继承自 UIViewController 的新 BaseViewController。在此 BaseViewController 中导入您的类别;

从现在开始,每当你创建一个新的 viewController 时,选择你的基类类型为 BaseViewController 而不是 UIViewController。

通过这样做,您可以从任何地方调用该警报显示方法。

【讨论】:

以上是关于如何在不重复代码的情况下在所有控制器中显示警报?的主要内容,如果未能解决你的问题,请参考以下文章

iOS - 如何在不按下按钮的情况下在视图控制器之间移动

如何在不使用某些框架的情况下在 php 中进行 MVC

如何在不通过 HTTP 加载图像的情况下在 HTML 中显示“重新加载”符号?

如何在不使用 UIWebView 的情况下在 iOS 10 中显示带有 HTML 标签的文本(使用 swift)

如何在不重复场景的情况下在黄瓜测试中编写功能?

如何在不知道维度的情况下在 C++ 中传递二维数组 [重复]