在 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 用于使用一些自定义的东西(这些东西必须根据所选按钮更改)。
我试过的
使用 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).
- 使用 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
。
所以,你有两种可能性:
使用故事板并将两个视图控制器放在上面。根据按下的按钮,使用instantiateViewControllerWithIdentifier
实例化你需要的视图控制器。
不要使用故事板。然后您可以手动创建所需的视图控制器并使用您的 UINavigationController
的 pushViewController
方法来呈现它。
你不能从parentclass投射到childclass,parentclass只是没有容量知道 child 在做什么。但是,您可以从 child 转换为 parent,因此您可能希望将视图控制器设置为 GrowingEffect,然后将其转换为 Effect,但是除非采用某种方法,否则也没有适合这样做的方法需要 parent class 而您正在使用 child class。看来您需要重新设计视图控制器的布局方式。现在我假设你有 2 children,让我们调用 GrowingEffect 和 ShrinkingEffect。在您的设计器中,您将 1 设置为 GrowingEffect,将另一个设置为 ShrinkingEffect,并确保它们具有唯一标识符。然后你可以使用你的视图来呈现效果,并传入其中任何一个 objects.
我在 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 用于使用一些自定义的东西(这些东西必须根据所选按钮更改)。
我试过的
使用 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).
- 使用 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
。
所以,你有两种可能性:
使用故事板并将两个视图控制器放在上面。根据按下的按钮,使用
instantiateViewControllerWithIdentifier
实例化你需要的视图控制器。不要使用故事板。然后您可以手动创建所需的视图控制器并使用您的
UINavigationController
的pushViewController
方法来呈现它。
你不能从parentclass投射到childclass,parentclass只是没有容量知道 child 在做什么。但是,您可以从 child 转换为 parent,因此您可能希望将视图控制器设置为 GrowingEffect,然后将其转换为 Effect,但是除非采用某种方法,否则也没有适合这样做的方法需要 parent class 而您正在使用 child class。看来您需要重新设计视图控制器的布局方式。现在我假设你有 2 children,让我们调用 GrowingEffect 和 ShrinkingEffect。在您的设计器中,您将 1 设置为 GrowingEffect,将另一个设置为 ShrinkingEffect,并确保它们具有唯一标识符。然后你可以使用你的视图来呈现效果,并传入其中任何一个 objects.