iOS Swift UIAlertView
iOS Swift UIAlertView
我是 iOS 应用程序开发的新手,但我没能找到类似的问题。
是否可以在同一个视图控制器中有两个或多个不同的警报?我的目标是 iOS 7.1,因此使用以下已弃用的 UIAlertView 方法:
let errorAlert: UIAlertView = UIAlertView()
errorAlert.delegate = self
errorAlert.message = "Are you sure?"
errorAlert.addButtonWithTitle("Yes")
errorAlert.addButtonWithTitle("No")
errorAlert.show()
此警报转到在 switch 语句中包含某些逻辑的函数。
func alertView(View: UIAlertView!, clickedButtonAtIndex buttonIndex: Int) { ...
到目前为止一切正常,但是当我在同一视图控制器中创建第二个警报时,它也会进入相同的功能。例如,如果我无法与数据库建立连接,我将显示不同的错误消息,但这也会转到上面的 alertView 函数并运行相同的 switch 语句。
我有明显的错误吗?
提前致谢。
你可以试试这样写:
func alertView(view: UIAlertView!, clickedButtonAtIndex buttonIndex: Int) {
if view == errorAlert {
// do your stuff..
} else if view == anotherAlertView {
// do your stuff for the second AlertView
}
}
您可以使用 BlocksKit, or UIAlertView-Blocks 通过块而不是委托模式将操作分配给警报按钮。它比创建大量 if alert == self.firstAlert {...} else if alert == self.secondAlert { ... } else ...
条件更具可读性。
编辑:好的,我想我们需要 moar 选项来解决这个问题!这是另一种(第 4 种)方法:您可以为每个 UIAlertView 委托创建单独的 class:
class FirstErrorHandler: UIAlertViewDelegate {
init() {
let errorAlert: UIAlertView = UIAlertView()
errorAlert.delegate = self
errorAlert.message = "Are you sure?"
errorAlert.addButtonWithTitle("Yes")
errorAlert.addButtonWithTitle("No")
errorAlert.show()
}
func alertView(view: UIAlertView!, clickedButtonAtIndex buttonIndex: Int) {
// handle first kind of errors
}
}
class SecondErrorHandler: UIAlertViewDelegate {
init() { ... }
func alertView(view: UIAlertView!, clickedButtonAtIndex buttonIndex: Int) {
// handle another kind of errors
}
}
class MyViewController {
var alertHandler: UIAlertViewDelegate! // store strong reference to alert handler
...
func showSomeError() {
self.alertHandler = FirstErrorHandler()
...
}
}
请记住,您可以将任何对象分配给 UIAlertView.delegate,而不仅仅是 UIViewController。它更具可读性,然后在 MyViewController 的第 133 行显示警报和标签按钮,然后在 MyViewController 的第 765 行的 if/else 语句列表中处理某些块内的操作。
上面的两个答案是正确的并且可以工作,但只是为了提供另一种选择:可以设置警报视图的 tag
属性,所以
let errorAlert: UIAlertView = UIAlertView()
errorAlert.tag = my_tag // just some arbitrary number that you can reference later
// other stuff
errorAlert.show()
然后
func alertView(view: UIAlertView!, clickedButtonAtIndex buttonIndex: Int) {
if view.tag == my_tag {
// view is errorAlert, perform the appropriate logic here
}
}
我是 iOS 应用程序开发的新手,但我没能找到类似的问题。
是否可以在同一个视图控制器中有两个或多个不同的警报?我的目标是 iOS 7.1,因此使用以下已弃用的 UIAlertView 方法:
let errorAlert: UIAlertView = UIAlertView()
errorAlert.delegate = self
errorAlert.message = "Are you sure?"
errorAlert.addButtonWithTitle("Yes")
errorAlert.addButtonWithTitle("No")
errorAlert.show()
此警报转到在 switch 语句中包含某些逻辑的函数。
func alertView(View: UIAlertView!, clickedButtonAtIndex buttonIndex: Int) { ...
到目前为止一切正常,但是当我在同一视图控制器中创建第二个警报时,它也会进入相同的功能。例如,如果我无法与数据库建立连接,我将显示不同的错误消息,但这也会转到上面的 alertView 函数并运行相同的 switch 语句。
我有明显的错误吗?
提前致谢。
你可以试试这样写:
func alertView(view: UIAlertView!, clickedButtonAtIndex buttonIndex: Int) {
if view == errorAlert {
// do your stuff..
} else if view == anotherAlertView {
// do your stuff for the second AlertView
}
}
您可以使用 BlocksKit, or UIAlertView-Blocks 通过块而不是委托模式将操作分配给警报按钮。它比创建大量 if alert == self.firstAlert {...} else if alert == self.secondAlert { ... } else ...
条件更具可读性。
编辑:好的,我想我们需要 moar 选项来解决这个问题!这是另一种(第 4 种)方法:您可以为每个 UIAlertView 委托创建单独的 class:
class FirstErrorHandler: UIAlertViewDelegate {
init() {
let errorAlert: UIAlertView = UIAlertView()
errorAlert.delegate = self
errorAlert.message = "Are you sure?"
errorAlert.addButtonWithTitle("Yes")
errorAlert.addButtonWithTitle("No")
errorAlert.show()
}
func alertView(view: UIAlertView!, clickedButtonAtIndex buttonIndex: Int) {
// handle first kind of errors
}
}
class SecondErrorHandler: UIAlertViewDelegate {
init() { ... }
func alertView(view: UIAlertView!, clickedButtonAtIndex buttonIndex: Int) {
// handle another kind of errors
}
}
class MyViewController {
var alertHandler: UIAlertViewDelegate! // store strong reference to alert handler
...
func showSomeError() {
self.alertHandler = FirstErrorHandler()
...
}
}
请记住,您可以将任何对象分配给 UIAlertView.delegate,而不仅仅是 UIViewController。它更具可读性,然后在 MyViewController 的第 133 行显示警报和标签按钮,然后在 MyViewController 的第 765 行的 if/else 语句列表中处理某些块内的操作。
上面的两个答案是正确的并且可以工作,但只是为了提供另一种选择:可以设置警报视图的 tag
属性,所以
let errorAlert: UIAlertView = UIAlertView()
errorAlert.tag = my_tag // just some arbitrary number that you can reference later
// other stuff
errorAlert.show()
然后
func alertView(view: UIAlertView!, clickedButtonAtIndex buttonIndex: Int) {
if view.tag == my_tag {
// view is errorAlert, perform the appropriate logic here
}
}