在 Swift 中显示来自另一个视图控制器的子类视图控制器

Present subclassed view controller from another view controller in Swift

我在 Swift 中使用 subclasses 有一些问题,希望有人能帮助我。

我有什么

两个视图控制器:

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中做我想做的事:我需要根据按下的按钮设置一个subclass。

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

例如,如果我按下 第一个按钮,我想 显示 VC 2 和 class GrowingEffect 用于使用一些自定义的东西(这些东西必须根据所选按钮更改)。

我试过的

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

    let storyboard = UIStoryboard(name: "Main", bundle: nil)

    让 destinationViewController : UIViewController = storyboard.instantiateViewControllerWithIdentifier("EffectVC") as!成长效果

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

但我得到了

Could not cast value of type 'ViewAnimationDemo.EffectVC' (0x109948570) to 'ViewAnimationDemo.GrowingEffect' (0x109948650).

  1. 使用 PrepareForSegue

但是我无法设置任何子class

我真正想做的事

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

IB 中只有一个视图控制器 (EffectVC) 与 class EffectVC 关联。 class 效果VC 有一些子class 效果,例如 GrowingEffect。

在我的代码中,我想用我需要的 subclass 实例化视图控制器 EffectVC:例如 实例化 IB Effect[=85 中的视图控制器=] 与 class GrowingEffect.

我知道,如果我为 EffectVC 的每个子class 设置一个视图控制器,我可以做我想做的事,但我不想在 IB 中有那么多视图控制器,因为它们相等,我唯一想改变的是 2 种方法。

我认为您的设置有些问题。您应该有 2 个视图控制器,每个都在其文件中设置,并且每个都以其标识符出现在故事​​板中。如果 GrowingEffect 继承自 EffectVC 就可以了。

您当前使用 as! GrowingEffect 所做的实际上是尝试将您通过调用 instantiateViewControllerWithIdentifier("EffectVC") 获得的 UIViewController 实例转换为 GrowingEffect。这将不起作用,因为它是 EffectVC.

类型

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

编辑

如果使用故事板,则必须使用 instantiateViewControllerWithIdentifier 实例化视图控制器。但是你只能得到一个 GrowingEffect 的实例,如果它出现在故事​​板上的话。

"cast" EffectVC 的实例一旦创建就无法 GrowingEffect

所以,你有两种可能性:

  1. 使用故事板并将两个视图控制器放在上面。根据按下的按钮,使用instantiateViewControllerWithIdentifier实例化你需要的视图控制器。

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

你不能从parentclass投射到childclass,parentclass只是没有容量知道 child 在做什么。但是,您可以从 child 转换为 parent,因此您可能希望将视图控制器设置为 GrowingEffect,然后将其转换为 Effect,但是除非采用某种方法,否则也没有适合这样做的方法需要 parent class 而您正在使用 child class。看来您需要重新设计视图控制器的布局方式。现在我假设你有 2 children,让我们调用 GrowingEffect 和 ShrinkingEffect。在您的设计器中,您将 1 设置为 GrowingEffect,将另一个设置为 ShrinkingEffect,并确保它们具有唯一标识符。然后你可以使用你的视图来呈现效果,并传入其中任何一个 objects.