User Defined Runtime Attributes

Dans IB je défini une valeur dans mon ViewController avec User Defined Runtime Attributes. J'ai donc dans mon ViewController une clé et une valeur.


 


Comment puisse récupérer cette valeur dans le viewdidload voir même plutôt dans l'affichage de mon ViewController.


 


j'ai essayer :



let s = self.value(forKey: "category")

Mais ça crash :


this class is not key value coding-compliant for the key category.


Réponses

  • CéroceCéroce Membre, Modérateur

    Dans mon souvenir, il suffit simplement que l'objet ait la propriété "category".


    Attention, l'objet doit hériter de NSObject.


  • iLandesiLandes Membre
    décembre 2017 modifié #3

    Désolé Céroce, je comprends pas bien. Peut-être me suis je mal exprimé.


     


    Dans Interface builder je défini pour mon ViewController une valeur comme ci-dessous :


     


  • LexxisLexxis Membre
    décembre 2017 modifié #4

    "catagory" ou "category" ?


     


    C'est la cata... hum... oui je sors...


  • category mais c'est juste une erreur de copier/coller dans le post ici


  • D'après ce que j'ai compris, les valeurs définis dans "User Defines ..." permettent de modifier des propriétés de l'instance mais pas d'en créer. Il faut donc que ta classe ViewController dispose d'une propriété "category" de type String.


    Comme l'a dit Céroce finalement.


  • Merci j'y suis, il y a quand même une subtilité il faut que cette propriété soit de type @objc pour que cela fonctionne.


     


    Voici ce que cela donne



    class MyVC: UIViewController {
    @objc var category: String = "undefined"

    override func viewDidLoad() {
    super.viewDidLoad()
    print ("category", category)
    }
    }

    Ce qui affiche bien service pour moi ;-)


  • Joanna CarterJoanna Carter Membre, Modérateur

    Mais pourquoi as-tu besoin de ce dans IB ?


  • En fait j'ai une application toute simple avec 2 tab items qui affiche chacun un view controller. Les deux view controllers sont identiques : ils gèrent une collectionView. La seule différence sont les données (en gros un filtre sur ma sources).


     


    Avec un segue normal j'aurais passé cela en argument dans le performSegue mais dans le cas d'une tabBar cela m'a sembler plus simple de faire comme cela.


     


    Je reste ouvert à  toute "meilleure" proposition...


  • Joanna CarterJoanna Carter Membre, Modérateur

    enum Category
    {
    case unknown
    case first
    case second
    }


    class ViewController: UIViewController
    {
    var category = Category.unknown

    ...
    }


    class TabBarController : UITabBarController
    {
    override func viewDidLoad()
    {
    super.viewDidLoad()

    guard let firstViewController = childViewControllers[0] as? ViewController,
    let secondViewController = childViewControllers[1] as? ViewController else
    {
    return
    }

    firstViewController.category = .first

    secondViewController.category = .second
    }
    }
  • J'avais pensé à  cette solution mais j'aime bien aussi la solution avec le Storyboard.


  • Joanna CarterJoanna Carter Membre, Modérateur

    La problème avec les "User Defined Runtime Attributes" est qu'ils sont résolus en Strings, donc on peut se tromper avec l'orthographe.


  • Joanna CarterJoanna Carter Membre, Modérateur
    décembre 2017 modifié #13

    À la place des "User Defined Runtime Attributes", on peut utiliser @IBDesignable et @IBInspectable sur la vue :



    @IBDesignable
    class CategoryView : UIView
    {
    @IBInspectable var category: String = ""
    }

    ça donnera un var dans l'inspecteur d'IB sans besoin d'utiliser "self.value(forKey: "category")" pour le récupérer.


     


Connectez-vous ou Inscrivez-vous pour répondre.