首页 文章

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

提问于
浏览
3

我在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中显示子类视图控制器 .

如果我按 first button 例如我想 show the VC 2 with the class GrowingEffect 使用一些自定义的东西(这些东西必须根据所选按钮改变) .

我尝试了什么

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

let storyboard = UIStoryboard(名称:“Main”,bundle:nil)

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

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

但我明白了

无法将“ViewAnimationDemo.EffectVC”类型的值(0x109948570)转换为“ViewAnimationDemo.GrowingEffect”(0x109948650) .

  • 使用PrepareForSegue

但我不能设置任何子类

我真的想做什么

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

have only one view controller in IB (EffectVC) associate with the class EffectVC. The class EffectVC has some subclasses like GrowingEffect.

在我的代码中,我想用我需要的子类实例化视图控制器EffectVC:例如 instantiate the view controller in IB EffectVC with the class GrowingEffect .

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

2 回答

  • 2

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

    您目前使用 as! GrowingEffect 做的事实上是在尝试将 UIViewController 实例从调用 instantiateViewControllerWithIdentifier("EffectVC") 转换为 GrowingEffect . 这不起作用,因为它的类型为 EffectVC .

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

    EDIT

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

    一旦创建, EffectVC 的实例就不可能 EffectVCGrowingEffect .

    那么,你有两种可能性:

    • 使用故事板并在其上放置两个视图控制器 . 使用 instantiateViewControllerWithIdentifier 实例化所需的视图控制器,具体取决于按下的按钮 .

    • 不要使用故事板 . 然后,您可以手动创建所需的视图控制器,并使用 UINavigationControllerpushViewController 方法来呈现它 .

  • 2

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

相关问题