使用 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)
}
}
我在 ViewController.swift 有一个名为 backgroundView
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)
}
}