2015-09-26 1 views
3

J'ai un IBOutlet dans ViewController.swift appelé backgroundViewutilisant IBOutlet d'une autre classe rapide

class ViewController: UIViewController, SideBarDelegate { 

    @IBOutlet weak var backgroundView: UIView! 

Je veux utiliser cette IBOutlet sur SideBar.swift

@objc protocol SideBarDelegate{ 
    func sideBarDidSelectButtonAtIndex(index:Int) 
    optional func sideBarWillClose() 
    optional func sideBarWillOpen() 
} 

//When an item of the sidebar is selected, and also when the sidebar will open or close 
class SideBar: NSObject, SideBarTableViewControllerDelegate { 
    func handleSwipe(recognizer:UISwipeGestureRecognizer){ 
     let bgv = ViewController() 
     if recognizer.direction == UISwipeGestureRecognizerDirection.Right { 
      showSideBar(false) 
      delegate?.sideBarWillClose?() 
      let blurEffect = UIBlurEffect(style: UIBlurEffectStyle.Light) 
      let blurView = UIVisualEffectView(effect: blurEffect) 
      blurView.frame = bgv.backgroundView.bounds 
      bgv.backgroundView.addSubview(blurView) 

     } else { 
      showSideBar(true) 
      delegate?.sideBarWillOpen?() 
     } 
    } 

Mais en montrant le côté barre, l'arrière-plan ne brouille pas. Qu'est-ce qui ne va pas?

+0

Je pense que ce qui se passe est que vous devez vous assurer que ViewController est la même instance du contrôleur de vue du IBOutlet est câblé jusqu'à. En ce moment vous venez d'instancier un nouveau ViewController sans une plume ou un storyboard –

+0

merci! Je comprends ce qui ne va pas: D – Songshil

Répondre

0

Vous n'accédez pas réellement à l'instance de ce contrôleur de vue. Vous en créez un nouveau et l'affectez à bgv, puis vous modifiez celui-ci.

Vous pouvez y accéder via le délégué, mais pas en créant un nouveau contrôleur de vue. Vous devrez également l'ajouter en tant que variable à votre protocole.

Une meilleure idée serait de déplacer les données que le contrôleur View doit gérer vers cette classe au lieu d'essayer d'accéder aux vues de ce contrôleur. Cela défait totalement le but de la délégation.

let blurEffect = UIBlurEffect(style: UIBlurEffectStyle.Light) 
let blurView = UIVisualEffectView(effect: blurEffect) 
blurView.frame = backgroundView.bounds 
backgroundView.addSubview(blurView) 

Tout ce code devrait aller sideBarWillClose dans votre délégué (la mise en œuvre du contrôleur de vue de cette méthode)

Je recommande aussi ne pas faire ces fonctions optionnelles, comme vous allez vouloir le parent contrôleur pour pouvoir faire des choses quand le menu s'ouvre et se ferme. Plus qui nettoie votre code un peu, moins? S

+1

Je l'ai eu J'ai fait func sideBarWillClose() dans la classe ViewController et ça fonctionne merci beaucoup :) – Songshil

2
class ViewController: UIViewController, SideBarDelegate { 

    @IBOutlet weak var backgroundView: UIView! 

    var sideBar:SideBar = SideBar() 

    override func viewDidLoad() { //show side bar or not 

     sideBar = SideBar(sourceView: self.view, menuItems: ["first item", "second item", "funny item"]) 
     sideBar.delegate = self 
    } 

    func sideBarDidSelectButtonAtIndex(index: Int) { //which menuitem you take 
     if index == 2 { 
      // imageView.backgroundColor = UIColor.redColor() 
      //imageView.image    = nil 
     } else if index == 0 { 
      //imageView.image = UIImage(named: "stars") 
     } 
    } 

    func sideBarWillOpen() { 
     let blurEffect = UIBlurEffect(style: UIBlurEffectStyle.Light) 
     let blurView = UIVisualEffectView(effect: blurEffect) 
     blurView.frame = backgroundView.bounds 
     backgroundView.addSubview(blurView) 
    } 
}