how to DownCasting UIViewController Swift



基本视图控制器

import UIKit
class SubViewPost: UIViewController {
@IBOutlet weak var content: UILabel!
@IBOutlet weak var recommendCount: UILabel!
@IBOutlet weak var recommendButton: UIButton!
var postInfo:PostInfo!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}

}

子ViewController

import UIKit
class SubViewOne: SubViewPost {
@IBAction func likeWorry(_ sender: Any) {
Option.recommend(postInfo: postInfo, mRecommendCount: recommendCount, mRecommendButton: recommendButton)
}

}

和另一个子视图控制器

import UIKit
class SubViewTwo: SubViewPost {
override func viewDidLoad() {
recommendCount.alpha=0
recommendButton.alpha=0
}

}

我想添加subviewOne或SubViewTwo

我的ParentView

var subViewPost:SubViewPost
if postType == 1{
subViewPost = storyboard?.instantiateViewController(withIdentifier: "SubViewPost") as! SubViewOne
}else{
subViewPost = storyboard?.instantiateViewController(withIdentifier: "SubViewPost") as! SubViewTwo
}
containerView.addSubview(subViewPost.view)

上升错误

Could not cast value of type 
'MyApp.SubViewPost' (0x101151728) to 'MyApp.SubViewOne' (0x10114d9d0).
2018-07-10 14:40:56.007436+0900 MyApp[7207:209932] 
Could not cast value of type 'MyApp.SubViewPost' (0x101151728) to 'MyApp.SubViewOne' (0x10114d9d0).

如何根据postType 修改视图控制器

SubView One已推荐

但是SubView Two没有推荐

子视图1,2具有相同的UI

故事板中场景"SubViewPost"的UViewController类设置为SubViewPost,这就是instantiateViewController将返回的内容。不能将SubViewPost的实例下变频为SubViewOneSubViewTwo

您可以在故事板中定义两个相同的场景,每个场景都有适当的视图控制器类,但这需要大量的重复。

既然唯一的区别是recommendButtonrecommendCount元素的可见性,为什么不通过属性来处理呢

var subViewPost = storyboard?.instantiateViewController(withIdentifier: "SubViewPost") as! SubViewPost
subViewPost.recommendVisible = (postType == 1)

SubViewPost.swift

var recommendVisible = true 
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
recommendCount.isHidden = !recommendVisible
recommendButton.isHidden = !recommendVisible
}

错误消息很清楚。当你说

storyboard?.instantiateViewController(withIdentifier: "SubViewPost")

你从故事板中得到的是一个视图控制器,它的类是SubViewPost。你不能挥动施法棒并声称它是SubViewOne;事实并非如此。

如果您希望此视图控制器是SubViewOne,那么您应该在Identity检查器的情节提要中将其声明为SubViewOne


我想我明白你在努力做什么,以及为什么你对为什么不能这样做感到困惑。

故事板中的是实例,而不是类。是的,它是某个类的实例,但它是该类的实例。因此,当你在故事板中设计接口时,你就是在设计与相关联的接口,该接口与该类的一个实例相关。

如果您的目标是拥有一个与多个类关联的单个接口,则该接口必须在代码中生成或从View.xib文件加载,而不是在故事板中设计。


然而,在这种情况下,您最好不要尝试使用子类化。在类似的情况下,我所做的是给我的视图控制器一个枚举属性,说明它是哪种"类型"的视图控制器,并在代码中相应地服从。这样一来,一个类就有多种用途。

最新更新