如何在 ViewController 中多次使用自定义 nib 视图
Posted
技术标签:
【中文标题】如何在 ViewController 中多次使用自定义 nib 视图【英文标题】:How to use custom nib view in ViewController multiple times 【发布时间】:2015-02-16 22:21:16 【问题描述】:我正在尝试从 nib 加载自定义 UIView
CustomView.swift
import UIKit
@IBDesignable class CustomView: UIView
var view: UIView!
override init(frame: CGRect)
super.init(frame: frame)
xibSetup()
required init(coder aDecoder: NSCoder)
super.init(coder: aDecoder)
xibSetup()
func xibSetup()
view = loadViewFromNib()
view.frame = bounds
view.autoresizingMask = UIViewAutoresizing.FlexibleWidth | UIViewAutoresizing.FlexibleHeight
addSubview(view)
func loadViewFromNib() -> UIView
var nibName:String = "CustomView"
var bundle = NSBundle(forClass: self.dynamicType)
var nib = UINib(nibName: nibName, bundle: bundle)
var view = nib.instantiateWithOwner(self, options: nil)[0] as UIView
return view
CustomView.xib
文件的所有者是 CustomView 类。
在故事板中
我有一个 UIViewController(滚动视图控制器)和一个带有自定义类的 UIView:CustomView。 xib @IBDesignable 传播通过,一切都很好。
现在问题开始了。我试图在 ScrollViewController 中多次使用 customView(就像 tableView 中的单元格),就像我使用 viewOne 一样
ScrollViewController.swift
import UIKit
class ScrollViewController: UIViewController
let scrollView = UIScrollView()
override func viewDidLoad()
super.viewDidLoad()
let height = CGFloat(200.0)
self.scrollView.frame = self.view.bounds
self.scrollView.contentSize = CGSizeMake(self.view.bounds.size.width, height*3)
self.view.addSubview(self.scrollView)
var y = CGFloat(0.0)
for i in 0..<2
//Adding viewOne
let viewOne = self.createViewOne(i)
viewOne.frame = CGRectMake(0, y, 320, 200)
self.scrollView.addSubview(viewOne)
//Adding CustomView
let customView = self.createCustomView(i)
customView.frame = CGRectMake(0, y, 320, 200)
self.scrollView.addSubview(customView)
y += height
func createViewOne(index: Int) -> UIView
let viewOne = UIView()
if index == 0
viewOne.backgroundColor = UIColor.greenColor()
if index == 1
viewOne.backgroundColor = UIColor.redColor()
return viewOne
func createCustomView(index: Int) -> UIView
let customView: CustomView = NSBundle.mainBundle().loadNibNamed("CustomView", owner: self, options: nil)[0] as CustomView --> Code breaks here
if index == 0
customView.backgroundColor = UIColor.greenColor()
if index == 1
customView.backgroundColor = UIColor.redColor()
return customView
问题 代码在下面的行中断并且控制台输出没有帮助(lldb)
let customView: CustomView = NSBundle.mainBundle().loadNibNamed("CustomView", owner: self, options: nil)[0] as CustomView
我也试过用这段代码实例化:
customView = CustomView.loadViewFromNib()
然后我收到错误“调用中参数 #1 的参数丢失”
1) 如何在 ViewController 中多次从 nib 加载自定义 UIView。 2) 如何更改视图中包含的 UI 元素,例如 UIImageView、UILabels 等。如何设置标题,如 customView.title.text = "Fido"
任何帮助将不胜感激!谢谢。
【问题讨论】:
【参考方案1】:视图类的全部意义在于它加载了 nib 并将创建的视图添加为子视图。它也被定义为 nib 的所有者。
因此,当您的视图控制器尝试以自身为所有者加载 nib 时,它调用了所有的出口设置器,但它没有实现它们,因此它中断了。
要解决这个问题,您应该分配并初始化视图,而不是在视图控制器中显式地从 nib 加载它。
替换
let customView: CustomView = NSBundle.mainBundle().loadNibNamed("CustomView", owner: self, options: nil)[0] as CustomView
与
let customView = CustomView()
【讨论】:
感谢您的回答。如果您能在代码中展示如何做到这一点,以及代码应该放在 ViewController 中的什么位置,将不胜感激。谢谢 然后我得到两个错误:.../XCode Projects/CustomViewNib/CustomViewNib/ScrollViewController.swift:76:13: 'let' 声明需要一个初始化表达式"Missing argument for parameter #1 in打电话”。 这行得通:让 customView = CustomView(frame: CGRectMake(0, 0, 320, 200))。它需要一个框架。 好的,是的,你覆盖了 2 个 init 方法,不包括普通版本(这可能是最好的)。 我在这一行得到 EXC_BAD_ACCESS - 让 view = nib.instantiateWithOwner(self, options: nil)[0] as!界面视图。我正在使用 Xcode 7.3.1以上是关于如何在 ViewController 中多次使用自定义 nib 视图的主要内容,如果未能解决你的问题,请参考以下文章
iOS 为何使用runtime多次方法交换后却能按照交换顺序依次执行代码逻辑?
如何在自定义 UIView 中从 ViewController 传递数据
Swift - 如何在自定义 AlertController 中点击按钮时呈现 ViewController