如何在不重复代码的情况下在所有控制器中显示警报?
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。
通过这样做,您可以从任何地方调用该警报显示方法。
【讨论】:
以上是关于如何在不重复代码的情况下在所有控制器中显示警报?的主要内容,如果未能解决你的问题,请参考以下文章
如何在不通过 HTTP 加载图像的情况下在 HTML 中显示“重新加载”符号?