基本视图控制器
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
的实例下变频为SubViewOne
或SubViewTwo
。
您可以在故事板中定义两个相同的场景,每个场景都有适当的视图控制器类,但这需要大量的重复。
既然唯一的区别是recommendButton
和recommendCount
元素的可见性,为什么不通过属性来处理呢
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文件加载,而不是在故事板中设计。
然而,在这种情况下,您最好不要尝试使用子类化。在类似的情况下,我所做的是给我的视图控制器一个枚举属性,说明它是哪种"类型"的视图控制器,并在代码中相应地服从。这样一来,一个类就有多种用途。