【问题标题】:Swift - Add Custom Xib View As Subview ProgrammaticallySwift - 以编程方式将自定义 Xib 视图添加为子视图
【发布时间】:2017-01-12 08:42:25
【问题描述】:

我已经制作了一个自定义 xib,我之前在我的故事板中使用过,我只想创建一个自定义视图调整大小的实例,然后将其作为子视图添加到 uiscrollview。我试过在我的视图控制器的 viewdidload 函数中使用这段代码

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

但我收到此错误

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 的 swift 文件的代码

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
}

}

我没有使用自动布局,而是尝试简单地设置高度和宽度来测试从这两行手动添加子视图(也只是提醒一下,我是 iOS 开发的新手)

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

【问题讨论】:

  • 你的问题有很多困惑。 1)我已经制作了一个我以前在我的故事板中使用过的自定义 xib - 你是如何制作自定义 xib 的,我的意思是它是一个带有 .xib 扩展名的单独文件,如果是的话,你是如何在故事板中使用的。我的意思是没有代码我可以看到在某处使用 xib 的内容。 2)您没有使用自动布局约束 3)您没有在代码表单 xib 中初始化任何内容。我会说要么编辑帖子并发布您用于此特定实现的完整代码,要么发布一些您的目标的图形,我可以建议最佳方式。
  • @MaheshAgrawala 我刚刚对帖子进行了编辑希望对您有所帮助
  • 像这样改变 loadnib 行。 self.view = NSBundle.mainBundle().loadNibNamed("CardView", owner: nil, options: nil)[0] as! UIView 并尝试一次
  • 我建议你在这个类之外初始化它,然后把这个类的实例添加到那里的superview中。
  • @MaheshAgrawala 我更改了笔尖负载线,但它崩溃了

标签: ios swift xib addsubview


【解决方案1】:

下面是我在使用自定义 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。

【讨论】:

  • 我也在情节提要中使用卡片视图,如果我不初始化它们,这些卡片视图不会中断吗? (我有大约 30 个手动放置在情节提要中)
  • 我没有得到你想要达到的效果。你说你使用 xib 但现在你说你在故事板中使用。你有大约30个什么?你在故事板中放置了 30 个控制器?
  • 我认为您正试图以错误的方式实现您的要求。如果您需要不同类型的列表,那么您也可以使用不同类型的表格视图单元格,而不是设计 30 种不同类型的视图并在滚动视图中使用它们。或者你想做什么。
  • 对不起,我不是很具体,我有一个视图控制器,我需要在其中以编程方式添加卡片视图,而您的答案仅适用于此。使用可视化故事板界面,我还放置了以 CardView 作为类的视图,我想说我确实需要以编程方式添加卡片视图,setupWithSuperview() 将与所有其他 30 个左右的卡片视图一起使用手动添加到他们的视图控制器是行不通的。
  • 是的,如果您将它们放在情节提要中,那么它们将无法工作。但是你是如何在故事板中放置 uiViews 的呢?因为在情节提要中你只能放置控制器吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-11
  • 2016-02-03
  • 1970-01-01
  • 1970-01-01
  • 2011-08-22
  • 1970-01-01
相关资源
最近更新 更多