[英]Present subclassed view controller from another view controller in Swift
我在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,以便使用一些自定义的东西(这些东西必须根据所选按钮改变)。
使用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)。
但我不能设置任何子类
我知道还有一些其他解决方案,比如不使用故事板,但现在我准确描述了我想要做的事情,希望这是可能的:
IB(EffectVC)中只有一个视图控制器与EffectVC类相关联。 EffectVC类有一些像GrowingEffect这样的子类。
在我的代码中,我想用我需要的子类实例化视图控制器EffectVC:例如,使用类GrowingEffect在IB EffectVC中实例化视图控制器 。
我知道如果我为EffectVC的每个子类都有一个视图控制器,我可以做我想要的但我不想在IB中有这么多的视图控制器,因为它们是相同的,我想要改变的唯一的东西是2种方法。
我认为你的设置中有一些混乱的东西。 您应该有2个视图控制器,每个视图控制器都在其文件中设置,并且每个视图控制器都在其中包含其标识符。 如果GrowingEffect
继承自EffectVC
。
你现在做的是什么as! GrowingEffect
as! GrowingEffect
实际上是试图将您从调用instantiateViewControllerWithIdentifier("EffectVC")
获得的UIViewController
实例instantiateViewControllerWithIdentifier("EffectVC")
为GrowingEffect
。 这不起作用,因为它是EffectVC
类型。
相反,你需要调用instantiateViewControllerWithIdentifier("EffectVC")
如果按钮X被按下,并instantiateViewControllerWithIdentifier("GrowingEffect")
如果按下按钮年。
编辑
如果使用storyboard,则必须使用instantiateViewControllerWithIdentifier
化视图控制器。 但是如果它存在于故事板上,你只能得到GrowingEffect
一个实例。
一旦创建,就EffectVC
将GrowingEffect
的实例“ EffectVC
为GrowingEffect
。
那么,你有两种可能性:
使用故事板并在其上放置两个视图控制器。 使用instantiateViewControllerWithIdentifier
来实例化您需要的视图控制器,具体取决于按下的按钮。
不要使用故事板。 然后,您可以手动创建所需的视图控制器,并使用UINavigationController
的pushViewController
方法来呈现它。
你不能从父类转换为子类,父类只是没有能力知道孩子正在做什么。 但是你可以从一个子节点转换为父节点,所以你需要将你的视图控制器设置为GrowingEffect,然后将它转换为Effect,但是除非某些方法需要父类并且你正在使用它,否则没有强大的适应性孩子班。 看起来您需要重新设计您希望视图控制器的布局方式。 现在我假设你有2个孩子,让我们调用GrowingEffect和ShrinkingEffect。 在您的设计器中,将1设置为GrowingEffect,将另一个设置为ShrinkingEffect,并确保它们具有唯一标识符。 然后,您可以使用视图显示效果,并传入其中任何一个对象。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.