【问题标题】:snackbar with custom Function call in Swift在 Swift 中具有自定义函数调用的小吃吧
【发布时间】:2017-12-14 04:57:14
【问题描述】:

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

我可以试试看显示

  • 实例成员 'uncheck' 不能用于类型 'DetailsInfoViewController' 您是要改用此类型的值吗?

这是代码

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里面的自定义函数?

【问题讨论】:

  • 您遇到的错误是什么?
  • 只需在块内添加 self.uncheck() 因为它是一个块
  • 我在侧块中添加了 self.uncheck() 得到此错误(类型 '(NSObject) -> () -> DetailsInfoViewController' 没有成员 'uncheck)'

标签: ios swift snackbar


【解决方案1】:

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

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

如果对您没有帮助,请在您创建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() {}

}

当你的类在初始化时需要 self 在闭包内时,你发现了非常棘手的情况,但是这个 snackbar 变量在我们准备好使用的 self 变量之前初始化。这意味着我们需要在self 之后使用lazy var 初始化snackbar

但我强烈建议您不要像编写代码那样编写代码。 TTHSnackbar author's example 设计用于在真正需要显示此小吃吧时放置在函数中。例如:

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

}

【讨论】:

  • 功能代码类DetailsInfoViewController: { letsnackbar = TTGSnackbar(message: "考勤更新!", duration: .long, actionText: "SEND", actionBlock: { (snackbar) in uncheck() print( "snack bar Action") }) 在同一个类中我正在调用 func uncheck() function func uncheck() { print("snackbar uncheck function")snackbarCount -= 1 checkSnackBar() }
  • lazy var snapbar = TTGSnackbar(message: "Attendance Update !", duration: .long, actionText: "SEND") { (snackbar) in self.uncheck() print("snack bar Action" ) } 这可以正常工作,谢谢兄弟
  • 我在 tableview 中使用了多个复选框 我可以试试这个,但是在 table view 中显示了多个小吃店 @IBAction func showSnackbarButtonTapped(_ sender: UIButton) { let snapbar = TTGSnackbar(message: "TTGSnackBar !", duration: .middle, actionText: "Action!") { (snackbar) in self.uncheck() print("snack bar Action") }snackbar.show() }
  • @nagarajukankanala,可以通过保持对显示的最后一个小吃店的弱引用并在显示新的小吃店之前将其隐藏来完成。我更新了答案以显示它。
猜你喜欢
  • 2021-12-08
  • 2019-07-25
  • 2020-02-20
  • 2015-02-13
  • 2020-10-29
  • 2020-09-07
  • 2018-07-03
  • 2020-10-18
  • 2019-07-24
相关资源
最近更新 更多