我尝试为单个标签的UIToolbar加载一个简单的自定义xib只是为了让事情正常工作,并且在init?(coder aDecoder: NSCoder)
方法尝试修改标签文本时失败,因为它&#39 ; s尚未实例化。
致命错误:在解包可选值时意外发现nil
我在这里使用UIView代替UIToolbar ,因为它更容易使用,这可能是问题所在。如果我在我的xib文档中使用UIToolbar,它会强制我放在UIToolbar上的所有内容都是UIBarButtonItem,而这种不幸的大小效应就是它创建的不需要的填充。注意将UIViews添加到图像中的UIToolbar时可以看到的红色条纹(看看红色是多么丑陋!):
我相信我已经在Xcode的Inspector面板中设置了所有必要的设置和IBOutlets。并且使用简单的居中x,y布局约束。
更新1:
如果我将UIView添加到UIToolbar,我将会遇到UIToolbar的视图层次结构> UIBarButtonItem> UIView的。选择UIView并读取Xcode右侧面板上的Size Inspector,您将看到类似于以下内容的内容:
这有一个不可用的副作用(UIView左边16点,顶面6点)。虽然有足够大的UIView,但是顶部的6个点可以重新获得,但是左边的16个不能。再次注意顶部图像中的红色边距。
更新2:
现在我的新解决方案已修复了16点的任何UIView偏移。
答案 0 :(得分:4)
我找到了你的问题。
您的问题,您在.XIB中使用UIView代替UIToolbar 。
按照以下步骤操作。
1)您需要从 XIB 文件中删除 UIView 。和添加UIToolbar 代替UIVIew。
2)将标识分配给XIB CustomToolbar.swift
3)现在将 IBOutlet 设置为 CustomToolbar.swift
中的项目4)在你的Viewdidload下面放置代码,
let toolBar = UINib(nibName: "CustomToolbar", bundle: nil).instantiateWithOwner(nil, options: nil).first as! CustomToolbar
self.navigationController!.view.addSubview(toolBar)
self.navigationController!.toolbarItems = toolBar.items
5)在你的所有viewcontrollers中,viewdidload添加
self.toolbarItems = self.navigationController!.toolbarItems
编辑: - 您可以在UIToolbar中添加UIView并根据您的要求添加controll。
我希望此信息对您有所帮助。
答案 1 :(得分:2)
您的xib引用丢失了。这就是你犯了致命错误的原因。
调试时,你会得到'UILabel'为零。
不使用.xib,您可以使用我的以下代码。
import Foundation
import UIKit
class CustomToolbar: UIToolbar {
var label: UILabel!
required convenience init(coder aDecoder: NSCoder) {
self.init(aDecoder)
self.initialize()
}
init(_ coder: NSCoder? = nil) {
if let coder = coder {
super.init(coder: coder)!
}
else {
super.init(frame: CGRectZero)
}
}
// Initial the toolbar based on the frame.
override init(frame:CGRect) {
super.init(frame:frame)
self.initialize()
}
// Initialize the label.
func initialize() {
self.label = UILabel.init();
self.label.textColor = UIColor.redColor();
self.label.font = UIFont.systemFontOfSize(18);
self.label.frame = CGRectMake(0, 0, UIScreen.mainScreen().bounds.width, 21);
self.addSubview(self.label);
label.text = "Some text assigned programmatically" // Success
}
}
答案 2 :(得分:0)
@BadalShah是正确的,虽然他在UINavigationController子类或UIViewController中添加子视图的处理实现并不理想 - 它应该在CustomToolbar类中处理,如下所述。
@VigneshKumar几乎是正确的!我需要在我的CustomToolbar类中加载nib。之前,我已将CustomToolbar类名应用于错误的UIView。我只需要将它分配给文件所有者。给xib提供与我的自定义类不同的文件名,这也有助于我减少对什么视图需要什么类名称赋值的困惑。
let nibName = "MyView"
func setup() {
view = loadViewFromNib()
view.frame = bounds
view.autoresizingMask = [.FlexibleWidth, .FlexibleHeight]
addSubview(view)
}
func loadViewFromNib() -> UIView {
let bundle = NSBundle(forClass: self.dynamicType)
let nib = UINib(nibName: nibName, bundle: bundle)
let view = nib.instantiateWithOwner(self, options: nil).first as! UIView
return view
}
override init(frame: CGRect) {
super.init(frame: frame)
setup()
}
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
setup()
// label should already be initialized. Let's try changing the text!
label.text = "Some new data!" // Works!
}