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
    }
}