从Swift中的另一个视图控制器呈现子类视图控制器

时间:2015-04-11 16:20:12

标签: ios swift uiviewcontroller subclass viewcontroller

我在Swift中使用子类时遇到一些问题,希望有人可以帮助我。

我拥有什么

两个视图控制器:

VC1 只有一些UIButtons

EffectVC 根据VC1上按下的按钮执行某些动画

import UIKit

protocol viewAnimation {
    func initialStateSet()
    func finalStateSet()
}

class EffectVC: UIViewController {

    @IBOutlet weak var mainImage: UIImageView!

    override func viewDidLoad() {
        super.viewDidLoad()
        self.initialStateSet()
    }

    override func viewDidAppear(animated: Bool) {
        self.finalStateSet()
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }

    func initialStateSet() {
    }

    func finalStateSet() {
    }
}

class GrowingEffect : EffectVC, viewAnimation {

    override func initialStateSet() {
        // some stuff
    }

    override func finalStateSet() {
        // other stuff
    }
}

问题

也许是一个简单的问题,但我无法在Swift中做我想做的事情:我需要根据按下的按钮设置一个子类。

换句话说,我需要根据在VC1上按下哪个按钮,从VC1中显示子类视图控制器。

如果我按下第一个按钮,我想显示带有类GrowEffect 的VC 2,以便使用一些自定义内容(这些内容必须根据所选内容进行更改按钮)。

我尝试了什么

  1. 使用IBAction创建我的子类VC2并显示它

    让storyboard = UIStoryboard(名称:" Main",bundle:nil)

    让destinationViewController:UIViewController = storyboard.instantiateViewControllerWithIdentifier(" EffectVC")为! GrowingEffect

    self.presentViewController(destinationViewController,animated:true,completion:nil)

  2. 但我得到了

      

    无法转换类型' ViewAnimationDemo.EffectVC'   (0x109948570)到' ViewAnimationDemo.GrowingEffect' (0x109948650)。

    1. 使用PrepareForSegue
    2. 但我无法设置任何子类

      我真正想做的事

      我知道还有一些其他解决方案,比如不使用故事板,但现在我准确描述了我想要做的事情,希望这是可能的:

      IB(EffectVC)中只有一个视图控制器与EffectVC类关联。 EffectVC类有一些子类,如GrowingEffect。

      在我的代码中,我想用我需要的子类实例化视图控制器EffectVC:例如使用类GrowEffect 在IB EffectVC中实例化视图控制器。

      我知道如果我为EffectVC的每个子类都有一个视图控制器,我可以做我想要的但是我不想在IB中有这么多的视图控制器,因为它们是相同的,我想要改变的唯一的东西是两种方法。

2 个答案:

答案 0 :(得分:2)

我认为你的设置中有一些混乱的东西。您应该有2个视图控制器,每个视图控制器都在其文件中设置,并且每个视图控制器都在其中包含其标识符。如果GrowingEffect继承自EffectVC,则可以。

您目前使用as! GrowingEffect执行的操作实际上是在尝试将您从调用UIViewController获得的instantiateViewControllerWithIdentifier("EffectVC")实例投射到GrowingEffect。这不起作用,因为它的类型为EffectVC

相反,如果按下按钮X,则需要调用instantiateViewControllerWithIdentifier("EffectVC"),如果按下按钮Y,则需要调用instantiateViewControllerWithIdentifier("GrowingEffect")

修改

如果使用storyboard,则必须使用instantiateViewControllerWithIdentifier实例化视图控制器。但是,如果故事板上存在GrowingEffect,您只能获得EffectVC的实例。

不可能"演员"一旦创建了GrowingEffectinstantiateViewControllerWithIdentifier的实例。

所以,你有两种可能性:

  1. 使用故事板并在其上放置两个视图控制器。使用UINavigationController来实例化您需要的视图控制器,具体取决于按下的按钮。

  2. 不要使用故事板。然后,您可以手动创建所需的视图控制器,并使用pushViewController的{​​{1}}方法来展示它。

答案 1 :(得分:2)

你不能从父类投射到子类,父类只是没有能力知道孩子在做什么。但是你可以从一个子节点转换为父节点,所以你需要将你的视图控制器设置为GrowingEffect,然后将它转换为Effect,但是除非某些方法需要父类并且你正在使用它,否则没有强大的适应性孩子班。看起来您需要重新设计您希望视图控制器的布局方式。现在我假设你有2个孩子,让我们调用GrowingEffect和ShrinkingEffect。在您的设计器中,将1设置为GrowingEffect,将另一个设置为ShrinkingEffect,并确保它们具有唯一标识符。然后,您可以使用视图呈现效果,并传入其中任何一个对象。