2017-07-10 6 views
0

J'utilise snackBar dans mon application, il fonctionne très bien dans mon application, mais je veux accéder à la fonction personnalisée de SnackBar Action Block.snackbar avec appel de fonction personnalisé dans Swift

Je peux essayer qu'il est montrant

  • membre de l'instance « décocher » ne peut pas être utilisé sur le type « DetailsInfoViewController » avez-vous dire d'utiliser une valeur de ce type à la place?

Voici le code

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

Comment puis-je accéder à la fonction personnalisée dans un snack bar actionBlock à l'intérieur?

+0

Quelle est l'erreur que vous obtenez? –

+0

il suffit d'ajouter self.uncheck() à l'intérieur du bloc car c'est un bloc –

+0

J'ai ajouté self.uncheck() dans le bloc latéral en obtenant cette erreur (Valeur de type '(NSObject) ->() -> DetailsInfoViewController' n'a aucun membre 'décocher) ' – naga

Répondre

1

Je suppose que vous avez initialisé snackbar à l'intérieur d'un class func ou quelque chose comme ça. De cet endroit self représente votre classe DetailsInfoViewController tant que vous avez besoin de l'objet de cette classe. Si vous initialisez cet objet avant snackbar, vous pouvez écrire comme ceci:

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

Si cela ne vous aide pas, s'il vous plaît afficher le code de fonction où vous créez snackbar.

UPD: Avec des changements minimes de votre code la solution suivante devrait fonctionner:

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

} 

Vous trouvé la situation très délicate quand nécessite votre classe self dans la fermeture comme initialisées mais cette snackbar Initialise variables avant d'avoir la variable self prête à l'emploi. Cela signifie que nous devons initialiser snackbar après self en utilisant lazy var.

Mais I fortement vous suggère de ne pas écrire de code comme vous l'avez écrit. Le TTHSnackbar author's example est conçu pour être placé dans une fonction lorsque ce casse-croûte doit vraiment être montré. Par exemple:

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

} 

Lorsqu'elle s'affiche sur la vue, elle sera conservée par cette vue.

UPD # 2: Pour afficher une seule Friterie à un moment où vous pourriez écrire comme ceci:

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

} 
+0

classe de code de fonction DetailsInfoViewController: { let snackbar = TTGSnackbar (message: "Présence mise à jour!", durée:.long, actionText: "ENVOYER", actionBlock: { (snack) à décocher() print ("snack-bar action") }) à l'intérieur même classe que je vous appelle Fonc décocher() func décocher() { print ("snackbar fonction décocher") snackbarCount - = 1 checkSnackBar() } – naga

+0

paresseux var snackbar = TTGSnackbar (message: "! Mise à jour de présence", durée: .long, actionText: "ENVOYER") { (snack) dans self.uncheck() impression ("snack bar Action") } cela peut fonctionner très bien merci bro – naga

+0

Je suis en utilisant plusieurs cases à cocher dans tableview je peux essayer celui-ci mais plusieurs barres d'en-cas montrant dans la vue tableau @IBAction func showSnackbarButtonTapped (_ sender: UIButton) { laissez snackbar = TTGSnackbar (message: "TTGSnackBar!", durée: .middle, actionText: "action!") {(snack) à self.uncheck() print ("snack-bar action") } snackbar.show() } – naga