我想设计幻灯片功能。所以我在没有任何segue的情况下在 Storyboard中使用容器 View 。centerView中有一个按钮可以打开或关闭leftView。但是这个功能是用container.swift编写的,我不知道如何设置委托(delegate)..请帮助我,谢谢。(所有代码如下)
容器.swift
import UIKit
class ContainerViewController: UIViewController,test {
var leftViewController: UIViewController? {
willSet{
if self.leftViewController != nil {
if self.leftViewController!.view != nil {
self.leftViewController!.view!.removeFromSuperview()
}
self.leftViewController!.removeFromParentViewController()
}
}
didSet{
self.view!.addSubview(self.leftViewController!.view)
self.addChildViewController(self.leftViewController!)
}
}
var rightViewController: UIViewController? {
willSet {
if self.rightViewController != nil {
if self.rightViewController!.view != nil {
self.rightViewController!.view!.removeFromSuperview()
}
self.rightViewController!.removeFromParentViewController()
}
}
didSet{
self.view!.addSubview(self.rightViewController!.view)
self.addChildViewController(self.rightViewController!)
}
}
var menuShown: Bool = false
func showMenu() {
print(__FUNCTION__,__LINE__)
UIView.animateWithDuration(0.3, animations: {
self.rightViewController!.view.frame = CGRect(x: self.view.frame.origin.x + 235, y: self.view.frame.origin.y, width: self.view.frame.width, height: self.view.frame.height)
}, completion: { (Bool) -> Void in
self.menuShown = true
})
}
func hideMenu() {
UIView.animateWithDuration(0.3, animations: {
self.rightViewController!.view.frame = CGRect(x: 0, y: self.view.frame.origin.y, width: self.view.frame.width, height: self.view.frame.height)
}, completion: { (Bool) -> Void in
self.menuShown = false
})
}
var centerView:CenterViewController!
override func viewDidLoad() {
super.viewDidLoad()
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let CenterNC:UINavigationController = storyboard.instantiateViewControllerWithIdentifier("CenterNC") as! UINavigationController
let leftVC:LeftViewController = storyboard.instantiateViewControllerWithIdentifier("LeftVC") as! LeftViewController
centerView = storyboard.instantiateViewControllerWithIdentifier("CenterVC") as! CenterViewController
self.leftViewController = leftVC
self.rightViewController = CenterNC
self.centerView.delegate = self
// Do any additional setup after loading the view.
}
}
CenterViewController.swift
import UIKit
protocol test{
func showMenu()
func hideMenu()
}
class CenterViewController: UIViewController {
var delegate:test! = nil
@IBAction func pressed(sender: AnyObject) {
if (delegate != nil) {
delegate.showMenu()
}
else{
print("Error")
}
}
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
最佳答案
通常你使用 whatever.delegate = self
但我不太确定你想做什么。 (还有 whatever.datasource = self
)。我不知道这是否适用于 VC。
据我所知,在包含两个其他 VC 的 Storyboard中使用一个 UIViewController
是不好的做法。
相反,您应该以编程方式或使用 Storyboard segue 进行过渡。
self.presentViewController(LeftViewController(), animated: true, completion: nil)
self.dismissViewController(true, 完成: nil)
View Controllers 会自动从内存中删除(如果你好奇,请查找 ARC)(只要你在 VC 中没有要删除的变量,这些变量是(或可以)从另一个未初始化的类访问的- 如果这令人困惑,请忽略它)
如果您想要滑动动画或类似的东西,最好在 GitHub 上找到一些东西以克隆并导入到您的项目中。我用我在网上找到的一些代码制作了一个带有标签栏的应用程序,该标签栏可以在 View 之间滑动。
我一直在喋喋不休,但在一个 VC 中有两个 VC 对内存和一般的不良做法来说是可怕的。改用自定义 Segues。
关于ios - 容器 View ,使用委托(delegate)失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33140546/