簡體   English   中英

如何向下澆鑄UIViewController Swift

[英]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 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
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM