2016-09-05 173 views
0

我製作了一個自定義xib,我之前在故事板中使用過,我只需創建自定義視圖調整大小的實例,然後將其作爲子視圖添加到uiscrollview。在我的視圖控制器Swift - 以編程方式將自定義Xib視圖作爲子視圖添加

let cardView = CardView(coder: NSCoder()) 
cardView!.frame.size.width = 100 
cardView!.frame.size.height = 100 
scrollView.addSubview(cardView!) 

的viewDidLoad中使用FUNC這個代碼塊伊夫嘗試,但我得到這個錯誤

Terminating app due to uncaught exception 'NSInvalidArgumentException', 
reason: '*** -containsValueForKey: cannot be sent to an abstract object 
of class NSCoder: Create a concrete instance!' 

編輯: 這是連接到CardView迅速文件中的代碼的.xib

import UIKit 

class CardView: UIView { 
@IBOutlet var view: UIView! 
@IBOutlet weak var cornerView: UIView! 

required init?(coder aDecoder: NSCoder) { 
    super.init(coder: aDecoder) 

    NSBundle.mainBundle().loadNibNamed("CardView", owner: self, options: nil) 
    self.addSubview(view) 
    view.frame = self.bounds 

    cornerView.layer.cornerRadius = 3 
    cornerView.layer.masksToBounds = true 

    view.layer.shadowOffset = CGSizeMake(1, 5); 
    view.layer.shadowRadius = 2; 
    view.layer.shadowOpacity = 0.2; 
    view.layer.masksToBounds = false 
} 

} 

代替使用自動佈局我試圖簡單地設置的高度和寬度,以測試從這些2行手動添加的子視圖(也只是平視我是iOS開發新手)

cardView!.frame.size.width = 100 
cardView!.frame.size.height = 100 
+1

你的問題有很多混亂。 1)我製作了一個定製的xib,我之前在故事板中使用過 - 如何製作自定義xib,我的意思是它帶有.xib擴展名的單獨文件,如果是這樣的話,可以在storyboard中使用。我的意思是沒有代碼可以看出哪些是在某處使用xib的內容。 2)你沒有使用自動佈局約束3)你沒有在你的代碼形式的xib中初始化任何東西。我會說要麼編輯帖子,併發布完整的代碼,你正在使用這個特定的實現或一些圖形,什麼是你的目標,我可以建議最好的方式。 –

+0

@MaheshAgrawala我剛剛對該帖子進行了編輯,希望能夠幫助 – XvKnightvX

+1

更改像這樣的loadnib行。 'self.view = NSBundle.mainBundle()。loadNibNamed(「CardView」,owner:nil,options:nil)[0] as! UIView'並嘗試一次 –

回答

0

我在使用自定義XIB進行視圖初始化的情況下使用了以下內容。

在類似於你的視圖類中,它的CardView代碼就像。

class CardView: UIView { 
    @IBOutlet weak var cornerView: UIView! 

    func setupWithSuperView(superView: UIView) { 
     self.frame.size.width = 100 
     self.frame.size.height = 100 
     superView.addSubview(self) 

     cornerView = UIView(frame: self.bounds) 
     cornerView.layer.cornerRadius = 3 
     cornerView.layer.masksToBounds = true 

     view.layer.shadowOffset = CGSizeMake(1, 5); 
     view.layer.shadowRadius = 2; 
     view.layer.shadowOpacity = 0.2; 
     view.layer.masksToBounds = false 
    } 
} 

和你在哪裏調用這個類進行初始化,使用這個。

let cardView = NSBundle.mainBundle("CardView").loadNibNamed("", owner: nil, options: nil)[0] as! CardView 
cardView.setupWithSuperView(scrollView) 

試試這一次。但要確保xib文件的第一個視圖是CardView類型的。我的意思是第一個視圖的類是CardView。

+0

我在故事板中使用卡片視圖,如果我不初始化它們,這些卡片視圖會不會中斷? (我有30左右,我手動放置在故事板) – XvKnightvX

+0

我沒有得到你想要達到的。你說你使用xib,但現在你說你正在使用故事板。你有大約30個什麼?你在故事板中放置了30個控制器? –

+0

我認爲你正試圖用錯誤的方法來達到你的要求。如果您需要使用不同類型的列表,則還可以使用不同類型的表格視圖單元格,而不是設計30種不同類型的視圖並在滾動視圖中使用它們。或者你想要做什麼確切的事情。 –

相關問題