我想编写一个函数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()
}
答案 0 :(得分:9)
在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
}
}
UPD:
您案件的代码:
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()
}
}
答案 1 :(得分:2)
在UIViewController上创建一个类别,在那里写一个方法,调用哪个应用程序将显示一个警告框。
现在创建一个新的BaseViewController,它将继承自UIViewController。在此BaseViewController中导入您的类别;
从这一点来说,每当你创建一个新的viewController时,选择你的基类类型作为BaseViewController而不是UIViewController。
通过这样做,您可以从任何地方调用该警报显示方法。