ios - 容器 View ,使用委托(delegate)失败

标签 ios swift

我想设计幻灯片功能。所以我在没有任何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.
    }
}

Debug ContainerView.swift

Debug CenterViewController.swift

最佳答案

通常你使用 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/

相关文章:

ios - 如何识别 iOS 中的混​​合层?

ios - UIButton.frame.origin.y 不是正确的值

xcode - 如何在 UITextView 返回/搜索键上添加一个 Action ?(swift 2)

ios - 适用于 iOS : SKAdNetworkItems, NSUserTrackingUsageDescription、ATTrackingManager 的 Google AdMob 新 SDK 设置。准则 5.1.2 - 法律 - 隐私 - 数据使用

ios - 确保 View 的 IBOutlets 已被实例化

swift - 为什么传递给函数的协议(protocol)默认值不会改变,即使函数在子类化时会改变?

swift - swift 3 在iPhone 5 屏幕上更新约束后图片不存在

ios - 如何将 UITextView 放在 TableViewController 的底部?

ios - 在显示/隐藏键盘 iOS11 上滚动 UITableView

javascript - React Native 中的表单验证