[英]how to DownCasting UIViewController Swift
基本ViewController
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)
}
}
和另一個子viewController
import UIKit
class SubViewTwo: SubViewPost {
override func viewDidLoad() {
recommendCount.alpha=0
recommendButton.alpha=0
}
}
我想添加subviewOne或SubViewTwo
我的父母
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
但是SubView 2不推薦
SubView 1,2具有相同的UI
錯誤消息是明確的。 當你說
storyboard?.instantiateViewController(withIdentifier: "SubViewPost")
從情節提要中獲得的是一個視圖控制器,其類為SubViewPost。 您不能揮舞着魔術棒,而是聲稱它是SubViewOne; 不是。
如果希望此視圖控制器為SubViewOne,則應在身份檢查器的情節提要中將其聲明為SubViewOne。
我想我知道您要嘗試做的事情,以及為什么對為什么不能這樣做感到困惑。
故事板上的內容是實例 ,而不是類。 是的,它是某個類的實例,但它是該類的實例。 因此,在情節提要中設計界面時,您正在設計與該類的一個實例相關聯的界面。
如果您的目標是使一個具有與多個類相關聯的接口,則該接口必須以代碼生成或從View .xib文件加載(而不是在情節提要中設計)。
但是,最好不要在這種情況下首先嘗試使用子類化。 在類似情況下,我要做的是為我的視圖控制器提供一個枚舉屬性,該屬性說明它是哪種類型的視圖控制器,並相應地遵循代碼。 這樣一來,一個類就可以達到多種目的。
該UViewController
在你的故事板類場景“SubViewPost”設置為SubViewPost
,這就是instantiateViewController
將重返。 您不能將SubViewOne
的實例下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
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.