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

我有的

两个视图控制器:

仅有一些UIButton的 VC1

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中呈现子类化的视图控制器。

例如,如果我按下第一个按钮,我想显示VC 2带有GrowingEffect 类,以使用一些自定义内容(这些内容必须根据所选按钮而改变)。

我尝试了什么
  • 使用IBAction创建我的子类VC2并显示它

    让Storyboard = UIStoryboard(名称:“Main”,包:nil)

    让destinationViewController:UIViewController = storyboard.instantiateViewControllerWithIdentifier(“EffectVC”)为!成长效应

    self.presentViewController(destinationViewController,动画:true,完成:无)

  • 但是我得到了

    无法转换类型为“ViewAnimationDemo.EffectVC”的值
    (0x109948570)到“ViewAnimationDemo.GrowingEffect”(0x109948650)。
  • 使用PrepareForSegue

  • 但我不能设置任何子类

    我真正想做的是

    我知道还有其他解决方案,例如不使用情节提要,但现在我确切地描述了我想做的事情,希望这是可能的:

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

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

    我知道,如果对EffectVC的每个子类都有一个视图控制器,我可以做我想做的事,但是我不想在IB中有这么多视图控制器,因为它们相等,所以我唯一想更改的就是2种方法。

    最佳答案

    我认为您的设置中有些混淆。您应该有2个视图控制器,每个视图控制器都在其文件中设置,每个视图控制器及其标识符都位于情节提要中。如果GrowingEffect继承自EffectVC是可以的。

    您当前对as! GrowingEffect所做的操作实际上是在尝试将您从将UIViewController调用为instantiateViewControllerWithIdentifier("EffectVC")所获得的GrowingEffect实例进行转换。这将不起作用,因为它的类型为EffectVC

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

    编辑

    如果使用情节提要,则必须使用instantiateViewControllerWithIdentifier实例化视图控制器。但是,如果情节提要中存在GrowingEffect实例,则只能得到它。

    创建后,无法将EffectVC实例“投射”到GrowingEffect

    因此,这里有两种可能性:

  • 使用情节提要,并在其上放置两个视图控制器。根据按下的按钮,使用instantiateViewControllerWithIdentifier实例化所需的视图控制器。
  • 不要使用情节提要。然后,您可以手动创建所需的视图控制器,并使用UINavigationControllerpushViewController方法进行呈现。
  • 关于ios - 在Swift中从另一个 View Controller 呈现子类化的 View Controller ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29580133/

    10-10 21:04