2016-09-05 124 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种不同类型的视图并在滚动视图中使用它们。或者你想要做什么确切的事情。 –

相关问题