[Résolu] Importer un xib :

busterTheobusterTheo Membre
août 2015 modifié dans API UIKit #1

Bonjour,


j'essaie mon premier xib (avec juste une image dans un imageview), et après avoir vu plusieurs tutos simples ou compliqués, je n'y parviens toujours pas. Le xib n'apparait pas. J'essaie une version de base.


 


Quelqu'un aurait-il une idée ? Merci d'avance.


 


Voilà  le topo :


J'ai créé mon xib et le fichier associé (UIView) avec le même nom.


voici le fichier :



import UIKit

class Bouches2a: UIView {

@IBOutlet weak var fondBouches2a: UIImageView!

var view: UIView!
var nibName: String = "Bouches2a"

override init(frame: CGRect) {
super.init(frame: frame)
}

required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
setUp()
}

func setUp() {
view = loadViewFromNib()

view.frame = bounds
view.autoresizingMask = UIViewAutoresizing.FlexibleWidth | UIViewAutoresizing.FlexibleHeight

addSubview(view)
}

func loadViewFromNib() -> UIView {
let bundle = NSBundle(forClass: self.dynamicType)
let nib = UINib(nibName: nibName, bundle: bundle)
let view = nib.instantiateWithOwner(self, options: nil)[0] as! UIView
return view
}
}

Et je l'appelle ainsi :



func setUpXib() {
let largeurbouches2a = CGFloat(170)
let hauteurbouches2a = CGFloat(252)
bouches2a = Bouches2a(frame: CGRect(x: 0, y: 0, width: largeurbouches2a, height: hauteurbouches2a))

viewBouchesTest.addSubview(bouches2a)
}

Avec évidemment au départ :



@IBOutlet weak var viewBouchesTest: UIView!
var bouches2a: Bouches2a!

Il doit me manquer un truc, mais je ne vois pas quoi...


Mots clés:

Réponses

  • Joanna CarterJoanna Carter Membre, Modérateur
    Question 1. Où se trouve le ViewContoller ?
  • CéroceCéroce Membre, Modérateur
    août 2015 modifié #3
    Je dis comme Joanna. Arrête de bricoler.
    Crée une sous-classe de UIViewController avec un xib associé (cocher la case à  la création).
  • Heu, je ne comprend pas trop la question.


     


    J'ai fait comme là , par ex.


     


    J'ai un fichier xib Bouches2a.xib auquel j'ai associé dans IB, la classe Bouches2a qui est le fichier Bouches2a.swift


     


    Puis j'essaie d'appeler tout ça dans un UIViewController de base.


  • busterTheobusterTheo Membre
    août 2015 modifié #5

    Arrête de bricoler.

    Bah, j'essaie de faire au mieux d'après ce que je vois sur le web.
    Je ne connais pas du tout les xibs.

    Crée une sous-classe de UIViewController avec un xib associé (cocher la case à  la création).

    J'ai déjà  croiser ça, et ne l'ai jamais fait, car je n'ai rien de clair là -dessus sur le web.
    Mei je vais essayer just now. Merci pour les conseils.
  • CéroceCéroce Membre, Modérateur
    août 2015 modifié #6
    Tu l'instancies avec initWithNibName:nil bundle:nil, et c'est tout. Ensuite, tu peux utiliser sa propriété .view.
    Mais tu as déjà  croisé les UIViewControllers si tu travailles avec les Storyboards. ça n'a rien de différent.
  • Joanna CarterJoanna Carter Membre, Modérateur
    Arrêtes de suivre cette vidéo ! Le mec a fait plusieurs erreurs, particulièrement il a fait le FileOwner comme une vue, mais le FileOwner devrait être un contrôleur.
  • Ok, j'y suis parvenu.


    C'est quand même vachement plus simple comme ça. Vous avez bien raison.


    En plus, j'arrive à  le faire monter dans un popover.


    Je suis vraiment content.


    Merci beaucoup.


     


    Je met quand même le bon code (enfin, il me semble) pour les neuneus comme moi.


     


    Le controller associé au xib :



    import UIKit

    class Bouches2aViewController: UIViewController {

    @IBOutlet weak var fondBouches2a: UIImageView!

    override func viewDidLoad() {
    super.viewDidLoad()

    }

    override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()

    }
    }

    L'appel du xib dans un popOver :



    func tapLigneSourireButton(sender: UIButton) {
    let largeurbouches2a = CGFloat(170)
    let hauteurbouches2a = CGFloat(252)

    bouches2aViewController.modalPresentationStyle = .Popover
    bouches2aViewController.preferredContentSize = CGSizeMake(largeurbouches2a, hauteurbouches2a)

    let popoverBouches2aViewController = UIPopoverController(contentViewController: bouches2aViewController)
    popoverBouches2aViewController.dismissPopoverAnimated(true)

    popoverBouches2aViewController.presentPopoverFromRect(sender.frame, inView: sender.superview!, permittedArrowDirections: UIPopoverArrowDirection.Any, animated: true)
    }

  •  


     


    Arrêtes de suivre cette vidéo ! Le mec a fait plusieurs erreurs

    Ah, ça fait plaisir.


  • CéroceCéroce Membre, Modérateur

    Je met quand même le bon code (enfin, il me semble) pour les neuneus comme moi.

    Tu n'es pas neuneu, tu n'utilises pas les bonnes sources d'infos, c'est tout.
  • Ouais, la toile est vaste et semée d'embûches.


  • Joanna CarterJoanna Carter Membre, Modérateur

    Petit cadeau :



    public protocol PopoverViewControllerDelegate
    {
    func popoverFerme(controller: PopoverViewController)
    }

    public class PopoverViewController : UIViewController
    {
    public var popoverDelegate: PopoverViewControllerDelegate?

    override public var modalPresentationStyle: UIModalPresentationStyle
    {
    get
    {
    return .Popover
    }
    set(newStyle)
    {
    super.modalPresentationStyle = newStyle
    }
    }

    override public var preferredContentSize: CGSize
    {
    get
    {
    return CGSize(width: 170.0, height: 252.0)
    }
    set(newSize)
    {
    super.preferredContentSize = newSize
    }
    }

    @IBAction func fermerPopover()
    {
    popoverDelegate?.popoverFerme(self)
    }
    }


    class ViewController: UIViewController, UIPopoverControllerDelegate, PopoverViewControllerDelegate
    {
    var popoverController: UIPopoverController? = nil

    required init(coder aDecoder: NSCoder)
    {
    super.init(coder: aDecoder)
    }

    @IBAction func tapLigneSorireButton(sender: UIButton)
    {
    let popoverViewController = PopoverViewController()

    popoverViewController.popoverDelegate = self

    NSBundle.mainBundle().loadNibNamed("PopoverView", owner: popoverViewController, options: nil)

    popoverController = UIPopoverController(contentViewController: popoverViewController)

    popoverController?.delegate = self

    popoverController?.presentPopoverFromRect(sender.frame, inView: self.view, permittedArrowDirections: .Any, animated: true)
    }

    func popoverControllerDidDismissPopover(popoverController: UIPopoverController)
    {
    annullerChangementsDePopover()
    }

    func popoverFerme(controller: PopoverViewController)
    {
    enregistrerChangementsDePopover()

    popoverController?.dismissPopoverAnimated(true)
    }

    func enregistrerChangementsDePopover()
    {

    }

    func annullerChangementsDePopover()
    {

    }
    }

  • Joanna Carter,


    tout d'abord merci pour ton cadeau.


    J'aimerai tant l'utiliser, mais je crois que je n'ai pas le niveau.


    J'ai pourtant croisé et vaguement utilisé ce genre de truc, mais là , je suis perdu.


     


    ça a l'air trop pro ce truc.


     


    Je vois le



    popoverController?.delegate = self

    réapparaà®tre, c'est encourageant, car je ne comprenais pas pourquoi je ne m'en servais plus.


     


    Les réponses à  venir seront, je n'en doute pas : "Révise tes cours sur les délégués". Oui, je n'arrète pas.


     


    Bon, déjà , je n'ai pas encore fait de "public class" ou "private class", car je flippe un peu, et... blablabla.


     


    Ensuite, les protocol, je ne les ai utilisé uniquement lorsque cela était exclusivement nécessaire (pour les delegate).


    Donc, j'ai déjà  mis du temps à  comprendre cela, malgré tous les conseils que j'ai eu grâce aux barmen, et lorsque j'ai pu implémenter cette technique pour des besoins précis, je suis passé à  la suite du projet.


    Il est vrai que je suis un peu en rush, et donc ne correspond pas vraiment à  l'élève type.


     


    En tout cas, cette expérience de monter une appli swift en 8 mois avec 6 mois d'expérience en objC (6 ans auparavant), et tout ça en autodidacte, me servira certainement dans l'avenir, mais pour l'instant, c'est hyper chaud. Je progresse pourtant beaucoup, mais les concepts (voire un peu abstraits) ont du mal à  s'implanter dans mon cerveau.


     


    J'ai lu et relu les boukins que j'ai, de l'époque de l'objectivC, et j'attend avec impatience celui-ci pour le swift, mais il était prévu au départ pour juin 2014, et depuis c'est sans arrêt décalé.


     


    Et le problème dans les boukins, c'est que l'on apprend les trucs de base : faire un tableView - faire un delegate, etc - Mais on ne peut pas y trouver (et c'est normal) les cas particuliers, qui sont légion, auxquels on est confronté.


     


    En ettendant, je modifie tout mon projet, sur les magic numbers et les xibs, et plein d'autre choses.


     


    Je perd du temps à  remanier, mais cela sera du temps de gagné pour mes écrans suivants (75%).


     


    De toutes les façons, je serais en retard pour la deadLine du 15 septembre. ça c'est sur, car je n'arrive pas à  faire l'enrollement chez Apple, dixit les paramètres administratifs (...) de la société pour laquelle je bosse. Mais ça, je m'en fout un peu. Bien que j'ai hâte de voir le projet sur mon iPad2 que j'ai depuis 15 jours, pour voir que y'a plein de conneries, notamment les constraints et autoLayout, etc.


     


    D'ici là , je garde le moral, et je m'éclate quand même. J'adore ce code, le swift, et j'ai hâte d'être meilleur. La route sera longue, je le sais et cela est bon. Plus c'est long, meilleur c'est  d;-)


     


    :p   :D   :p   :p   :D     :p   :o     :p


     


    Et vive la Bretagne...

  • Joanna CarterJoanna Carter Membre, Modérateur

    Si tu ne veux pas utiliser les protocols ou les delegates, tu peux utiliser les closures :



    public class PopoverViewController : UIViewController
    {
    public var fonctionDeFermeture: ((popoverViewController: PopoverViewController) -> ())? = nil

    override init(nibName nibNameOrNil: String?, bundle nibBundleOrNil: NSBundle?)
    {
    super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
    }

    required public init(coder aDecoder: NSCoder)
    {
    super.init(coder: aDecoder)
    }

    convenience init()
    {
    self.init(nibName: nil, bundle: nil)
    }

    override public var modalPresentationStyle: UIModalPresentationStyle
    {
    get
    {
    return .Popover
    }
    set(newStyle)
    {
    super.modalPresentationStyle = newStyle
    }
    }

    override public var preferredContentSize: CGSize
    {
    get
    {
    return CGSize(width: 170.0, height: 252.0)
    }
    set(newSize)
    {
    super.preferredContentSize = newSize
    }
    }

    @IBAction func fermerPopover()
    {
    fonctionDeFermeture?(popoverViewController: self)
    }
    }


    class ViewController: UIViewController, UIPopoverControllerDelegate
    {
    var popoverController: UIPopoverController? = nil

    required init(coder aDecoder: NSCoder)
    {
    super.init(coder: aDecoder)
    }

    @IBAction func tapLigneSorireButton(sender: UIButton)
    {
    let popoverViewController = PopoverViewController()

    popoverViewController.fonctionDeFermeture = {(popoverViewController: PopoverViewController) in
    self.enregistrerChangementsDePopover()

    self.popoverController?.dismissPopoverAnimated(true)
    }

    NSBundle.mainBundle().loadNibNamed("PopoverView", owner: popoverViewController, options: nil)

    popoverController = UIPopoverController(contentViewController: popoverViewController)

    popoverController?.delegate = self

    popoverController?.presentPopoverFromRect(sender.frame, inView: self.view, permittedArrowDirections: .Any, animated: true)
    }

    func popoverControllerDidDismissPopover(popoverController: UIPopoverController)
    {
    annullerChangementsDePopover()
    }

    func enregistrerChangementsDePopover()
    {

    }

    func annullerChangementsDePopover()
    {

    }
    }
  • Joanna CarterJoanna Carter Membre, Modérateur

    Et, pour ceux qui veulent voir la même chose pour Xcode 7 beta 4 :



    public class PopoverViewController : UIViewController
    {
    public var fonctionDeFermeture: ((popoverViewController: PopoverViewController) -> ())? = nil

    override public var modalPresentationStyle: UIModalPresentationStyle
    {
    get
    {
    return .Popover
    }
    set(newStyle)
    {
    super.modalPresentationStyle = newStyle
    }
    }

    override public var preferredContentSize: CGSize
    {
    get
    {
    return CGSize(width: 170.0, height: 252.0)
    }
    set(newSize)
    {
    super.preferredContentSize = newSize
    }
    }

    @IBAction func fermerPopover()
    {
    fonctionDeFermeture?(popoverViewController: self)
    }
    }


    class ViewController: UIViewController, UIPopoverPresentationControllerDelegate
    {
    var popoverController: UIPopoverPresentationController? = nil

    @IBAction func tapLigneSorireButton(sender: UIButton)
    {
    let popoverViewController = PopoverViewController(nibName: "PopoverView", bundle: nil)

    popoverViewController.fonctionDeFermeture = {
    popoverViewController in

    self.enregistrerChangementsDePopover(popoverViewController)

    self.dismissViewControllerAnimated(true, completion: nil)
    }

    if let popoverController = popoverViewController.presentationController as! UIPopoverPresentationController?
    {
    popoverController.sourceRect = sender.frame

    popoverController.sourceView = self.view

    popoverController.delegate = self
    }

    presentViewController(popoverViewController, animated: true, completion: nil)
    }

    func popoverPresentationControllerDidDismissPopover(popoverPresentationController: UIPopoverPresentationController)
    {
    annullerChangementsDePopover()
    }

    func enregistrerChangementsDePopover(popoverViewController: PopoverViewController)
    {

    }

    func annullerChangementsDePopover()
    {

    }
    }

  •  


     


    Si tu ne veux pas utiliser les protocols ou les delegates, tu peux utiliser les closures :

    Alors là , j'éclate de rire.


    Si si, je veux utiliser les protocol et delegate, mais je suis en apprentissage, et j'en utilise un peu, bien sûr, aidé par les barmen.


    Par contre les closures, j'ai eu des cours par entre autre AliGator, et je me suis un peu penché dessus, mais je suis loin d'avoir le niveau, et c'est pourquoi ta proposition me fais rigoler. Mais c'est super sympa. Il faut que j'imprime, et que j'étudie tout ça dans le finistère, la semaine prochaine.


     


    Je te répond rapidement sans avoir pris le temps de te lire car j'ai des potes à  la maison, et on joue d'la zik, un peu ambiance fête, et j'ai pas trop la tête au code. Je me libère un peu. ça fait du bien.


     


    Encore merci.


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