以编程方式加载自定义子视图,就像它们是单元格一样?
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
但由于我们在主视图中添加了滚动视图,并且苹果不建议/允许混合使用 scrollView
和 tableView
,因此我删除了表格视图并将自定义单元格替换为自定义 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以上是关于以编程方式加载自定义子视图,就像它们是单元格一样?的主要内容,如果未能解决你的问题,请参考以下文章
有没有办法以编程方式将 Excel 单元格保存到可以加载的本地文件,就像使用 VSTO 的“复制和粘贴”一样?
Swift - StackView 和添加约束,以编程方式添加视图到堆栈 - 加载后调整单元格高度?