使用 swift 中另一个 class 的 IBOutlet

using IBOutlet from another class in swift

我在 ViewController.swift 有一个名为 backgroundView

的 IBOutlet
class ViewController: UIViewController, SideBarDelegate {

    @IBOutlet weak var backgroundView: UIView!

我想在 SideBar.swift

上使用那个 IBOutlet
@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?()
        }
    }

但显示侧边栏时,背景不会模糊。 怎么了?

您实际上并没有访问该视图控制器的实例。您创建一个新的并将其分配给 bgv,然后您修改那个。

您可以通过委托访问它,但不能通过创建新的视图控制器来访问它。您还必须将其作为变量添加到您的协议中。

一个更好的主意是将视图控制器应该处理的内容移到那个 class 而不是试图访问该控制器的视图。这完全违背了授权的目的。

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

所有代码都应该放在 sideBarWillClose 您的委托中(视图控制器对该方法的实现)

我还建议不要将这些功能设为可选,因为您会希望父控制器能够在菜单打开和关闭时执行操作。再加上稍微清理一下你的代码,更少的 ?'s

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