I have alert that is being fired from different location so I decided to make a function to be called.
func alertSCFlag(x: Int) {
var alert = UIAlertController()
switch x {
case 1:
alert = UIAlertController(title: "Not Finished", message: "sorry but you must give the project a title and description", preferredStyle: UIAlertControllerStyle.alert)
default:
alert = UIAlertController(title: "Not Finished", message: "sorry but you need to choose a type of project", preferredStyle: UIAlertControllerStyle.alert)
}
alert.addAction(UIAlertAction(title: "Ok", style: UIAlertActionStyle.default, handler: nil))
self.present(alert, animated: true, completion: nil)
}
The problem is that the self obviously isn't universal and I'm having trouble figuring out how to pass it. Is there a way to pass self or better yet a superior way to approach the problem overall?
What you need is to extend UIViewController this way you don't need to pass any view controller as parameter and self will always be a view controller. And make sure you call the view controller's present method present(_ viewControllerToPresent: UIViewController, animated flag: Bool, completion: (() -> Void)? = nil)
from the main thread:
extension UIViewController {
enum Message: CustomStringConvertible {
case missingTitle, chooseProject
var description: String {
let message: String
switch self {
case .missingTitle: message = "sorry but you must give the project a title and description"
case .chooseProject: message = "sorry but you need to choose a type of project"
}
return message
}
}
func alertSCFlag(title: String = "Not Finished", message: Message) {
let alert = UIAlertController(title: title, message: message.description, preferredStyle: .alert)
alert.addAction(UIAlertAction(title: "Ok", style: .default))
DispatchQueue.main.async {
self.present(alert, animated: true)
}
}
}
Usage:
let vc = UIViewController()
vc.alertSCFlag(message: .chooseProject)
来源:https://stackoverflow.com/questions/47190809/swift-writing-a-function-that-takes-self-as-an-input