2015-09-26 2 views
3

У меня есть IBOutlet в ViewController.swift называется backgroundViewиспользования IBOutlet из другого класса в быстрых

class ViewController: UIViewController, SideBarDelegate { 

    @IBOutlet weak var backgroundView: UIView! 

И я хочу использовать что IBOutlet на 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?() 
     } 
    } 

Но при показе на стороне бар, фон не размывается. Что не так?

+0

Я думаю, что происходит в том, что вы должны убедиться, что ViewController тот же экземпляр контроллера просмотреть IBOutlet подключаемого до. Прямо сейчас вы просто создаете новый ViewController без ниба или раскадровки –

+0

спасибо! Я понимаю, что не так: D – Songshil

ответ

0

Вы фактически не обращаетесь к экземпляру этого контроллера представления. Вы создаете новый и назначаете его bgv, а затем вы изменяете его.

Вы можете получить к нему доступ через делегата, но не путем создания нового контроллера вида. Вы также должны добавить его в качестве переменной в свой протокол.

Лучшей идеей было бы перемещение материала, который контроллер представления должен обрабатывать этому классу, вместо того, чтобы пытаться получить доступ к представлениям этого контроллера. Это полностью разрушает цель делегирования.

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

Все, что код должен идти в sideBarWillClose в делегате (реализации контроллера представления этого метода)

Я также рекомендую не делаю эти функции не обязательно, как вы будете хотеть родитель контроллер, чтобы иметь возможность делать что-либо, когда меню открывается и закрывается. Кроме того, что очищает ваш код немного, меньше? S

+1

Я получил его Я сделал func sideBarWillClose() в классе ViewController и он работает спасибо большое :) – 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) 
    } 
} 
Смежные вопросы