以编程方式加载自定义子视图,就像它们是单元格一样?

Posted

技术标签:

【中文标题】以编程方式加载自定义子视图,就像它们是单元格一样?【英文标题】:Load custom SubView's programatically like if they were Cells? 【发布时间】:2016-07-18 09:30:07 【问题描述】:

我曾经有一个带有显示商店的自定义单元格的 tableView:

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 

        let cell : shopsTableViewCell = tableView.dequeueReusableCellWithIdentifier("shopCell", forIndexPath: indexPath) as! shopsTableViewCell

但由于我们在主视图中添加了滚动视图,并且苹果不建议/允许混合使用 scrollViewtableView,因此我删除了表格视图并将自定义单元格替换为自定义 UIView's . 我想继续相同的行为: 1 - 检测数组中有多少值。 2 - 为每个数组索引实例化一个 UIView 3 - 使用图像、位置、约束等值设置 UIView 4 - 将其添加到当前视图。

我正在使用情节提要,但在任何地方都看不到如何从情节提要中实例化自定义 UIView。此外,此 UIView 是 ViewController 内的子视图。

我做了一个带有插座的自定义 UIView 类:

import Foundation
import UIKit
class connectedShop : UIView

    @IBOutlet weak var bannerViewHight: NSLayoutConstraint!

    @IBOutlet weak var bannerViewTop: NSLayoutConstraint!
    @IBOutlet weak var bannerViewLeft: NSLayoutConstraint!
    @IBOutlet weak var bannerViewRight: NSLayoutConstraint!

    @IBOutlet weak var banerDiscount: UIImageView!
    @IBOutlet weak var bannerImageShop: UIImageView!
    @IBOutlet weak var bannerTitle: UILabel!
    @IBOutlet weak var bannerDescription: UILabel!
    @IBOutlet weak var bannerButton: UIButton!

    @IBAction func bannerButtonAction(sender: UIButton) 

    


在我的故事板中,我已将 subView“连接商店”连接到这个自定义类。还将情节提要 ID 设置为 customView:

我想实例化这个自定义子视图,每个连接的商店都有一个,就像我在 tableView 中所做的那样。 我试过了,但它崩溃了

let storyBoard = UIStoryboard(name: "Main", bundle: NSBundle.mainBundle())
                let viewController = storyBoard.instantiateViewControllerWithIdentifier("customView")

我也尝试创建一个新的自定义类,没有插座:

    import Foundation
import UIKit
class customShop : UIView

    var bannerViewHight: NSLayoutConstraint!
    var bannerViewTop: NSLayoutConstraint!
    var bannerViewLeft: NSLayoutConstraint!
    var bannerViewRight: NSLayoutConstraint!
    var banerDiscount: UIImageView!
    var bannerImageShop: UIImageView!
    var bannerTitle: UILabel!
    var bannerDescription: UILabel!
    var bannerButton: UIButton!


并尝试这样做:

var connectedShop : customShop = customShop()

                connectedShop.bannerTitle.text = "custom Shop"
                self.view.addSubview(connectedShop)

但它会因为这个错误而崩溃:

fatal error: unexpectedly found nil while unwrapping an Optional value

谁能帮我解决这个问题?

【问题讨论】:

我认为是导航问题 【参考方案1】:
let shopVw = UIStoryboard(name: "Main", bundle: nil).instantiateViewControllerWithIdentifier("customView") as! shopViewController
self.navigationController?.pushViewController(shopVw, animated: true) // this is the code for navigation

【讨论】:

我的自定义视图类继承自 UIView。您的代码适用于 UIViewController,但我有一个 UIView,但出现此错误:无法将“connectedShop”类型的值转换为预期的参数类型“UIViewController”【参考方案2】:

尝试加载 nib 并将其转换为您的类:

let view = NSBundle.mainBundle().loadNibNamed("YourClassView", owner: self, options: nil).first as! YourClassView

警告:您可以在 viewDidLoad 中加载 xib,但您应该使用 viewWillLayoutSubviews 中的视图进行操作,以便设置和运行约束,从而正确调整视图大小。

【讨论】:

我遇到了崩溃。我认为的原因是因为我试图实例化的 subView 在情节提要的场景中,而不是在 nib 文件中。 *** 由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“无法在包中加载 NIB:“NSBundle (已加载)”,名称为“customView”

以上是关于以编程方式加载自定义子视图,就像它们是单元格一样?的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法以编程方式将 Excel 单元格保存到可以加载的本地文件,就像使用 VSTO 的“复制和粘贴”一样?

Swift - StackView 和添加约束,以编程方式添加视图到堆栈 - 加载后调整单元格高度?

以编程方式选择表格视图中的所有单元格,以便下次按下它们时调用 didDeselect

如何以编程方式关闭展开的表格视图单元格?

在表格视图单元格中以编程方式显示图像

延迟加载 UICollectionViewCell 的自定义子视图