Swift 中带有自定义函数调用的小吃店

snackbar with custom Function call in Swift

我在我的应用程序中使用 snackBar,它在我的应用程序中运行良好,但我想从 SnackBar 操作块访问自定义函数。

我可以试试显示

这是代码

let snackbar = TTGSnackbar(message: "Attendance Update !",
                           duration: .long,
                           actionText: "SEND",

                           actionBlock: {
                                (snackbar) in

                            uncheck()

                            print("snack bar Action")

})

func uncheck()
{

    print("snackbar uncheck function")
    snackbarCount -= 1
    checkSnackBar()
}

如何访问snack Bar actionBlock里面的自定义函数?

我假设您已经在 class func 或类似的东西中初始化了 snackbar。从这个地方self代表你的classDetailsInfoViewController而你需要这个class的对象。如果你在snackbar之前初始化这个对象,你可以这样写:

let controller: DetailsInfoViewController = ...
let snackbar = TTGSnackbar(message: "Attendance Update !", duration: .long, actionText: "SEND") { [weak controller] (snackbar) in
    controller?.uncheck()
    print("snack bar Action")
}

如果对您没有帮助,请 post 您正在创建的函数代码 snackbar

更新: 通过对代码进行最少的更改,以下解决方案应该可以工作:

class DetailsInfoViewController: UIViewController {

    var snackbarCount = 0

    lazy var snackbar = TTGSnackbar(message: "Attendance Update !", duration: .long, actionText: "SEND") { (snackbar) in
        self.uncheck()
        print("snack bar Action")
    }

    func uncheck() {
        print("snackbar uncheck function")
        snackbarCount -= 1
        checkSnackBar()
    }

    func checkSnackBar() {}

}

当你的 class 需要 self 内部闭包时,你发现了非常棘手的情况,因为它初始化 但是 这个 snackbar 变量在我们有之前初始化即用型 self 变量。这意味着我们需要在 self 之后使用 lazy var.

初始化 snackbar

但是我强烈建议你不要像你写的那样写代码。 TTHSnackbar author's example 被设计成当这个 snackbar 真的需要显示时放在一个函数中。例如:

class DetailsInfoViewController: UIViewController {

    @IBAction func showSnackbarButtonTapped(_ sender: UIButton) {
        let snackbar = TTGSnackbar(message: "TTGSnackBar !", duration: .middle, actionText: "Action!") { (snackbar) in
            self.uncheck()
            print("snack bar Action")
        }
        snackbar.show()
    }

}

当它显示在视图上时,它将被此视图保留。

UPD #2: 要一次只显示一个 Snackbar,您可以这样写:

class DetailsInfoViewController: UIViewController {

    private weak var currentSnackbar: TTGSnackbar?

    @IBAction func showSnackbarButtonTapped(_ sender: UIButton) {
        if let snackbar = currentSnackbar {
            snackbar.dismiss()
            currentSnackbar = nil
        }

        let snackbar = TTGSnackbar(message: "TTGSnackBar !", duration: .middle, actionText: "Action!") { (snackbar) in
            self.uncheck()
            print("snack bar Action")
        }

        currentSnackbar = snackbar
        snackbar.show()
    }

}