【问题标题】:Present subclassed view controller from another view controller in Swift从 Swift 中的另一个视图控制器呈现子类视图控制器
【发布时间】:2015-06-17 06:38:06
【问题描述】:

我在 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 中的子类视图控制器。

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

我尝试了什么

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

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

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

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

但我得到了

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

  1. 使用 PrepareForSegue

但我不能设置任何子类

我真正想做的事

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

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

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

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

【问题讨论】:

    标签: ios swift uiviewcontroller subclass viewcontroller


    【解决方案1】:

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

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

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

    编辑

    如果您使用故事板,则必须使用 instantiateViewControllerWithIdentifier 实例化视图控制器。但您只能获得 GrowingEffect 的实例,前提是它出现在情节提要上。

    一旦创建,就不可能将EffectVC 的实例“转换”为GrowingEffect

    所以,这里有两种可能:

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

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

    【讨论】:

    • 好的,我知道这个解决方案,但我需要在 Interface Builder 2 视图控制器中进行设置...没有解决方案在 IB 中使用一个父类和子类和一个视图控制器?
    • 您也可以创建子类的实例并手动呈现。 IE。如果你愿意,你不需要一起使用故事板。
    • 嗯,我知道我只能通过代码来做这些事情,但现在我更新了我真正想做的问题,也许我不太清楚
    • 非常感谢!我对各种解决方案有疑问,但现在一切都清楚了:) 我正在评估第三种解决方案,使用属性并根据其价值做事。再次感谢您的宝贵时间!
    • @MassimoPolimeni 您可以在这里发布您的第三个解决方案作为答案吗?
    【解决方案2】:

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

    【讨论】:

    • 好的,我知道这个解决方案,但我需要在 Interface Builder 2 视图控制器中进行设置...没有解决方案在 IB 中使用一个父类和子类和一个视图控制器?
    • 您可以将它设置为故事板中的视图控制器是父级的位置,然后在呈现视图控制器时,您从故事板中获取父级,然后基于创建一个新的子对象父,并呈现该视图而不是let vc = self.storyboard.instantiateViewControllerWithIdentifier("Effect"); let childvc = GlowingEffect(viewController: vc) currentViewController.presentViewController(childvc, animated:true, completion:nil); 当然,您将必须实现 NSCoding 方法来创建复制。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-02-03
    • 2019-09-11
    • 1970-01-01
    • 2014-12-12
    • 1970-01-01
    • 1970-01-01
    • 2016-11-20
    相关资源
    最近更新 更多