Storyboard中的UINavigationController与自定义UIToolbar xib失败

时间:2016-02-25 05:22:15

标签: ios xcode swift

我尝试为单个标签的UIToolbar加载一个简单的自定义xib只是为了让事情正常工作,并且在init?(coder aDecoder: NSCoder)方法尝试修改标签文本时失败,因为它&#39 ; s尚未实例化。

  

致命错误:在解包可选值时意外发现nil

我在这里使用UIView代替UIToolbar ,因为它更容易使用,这可能是问题所在。如果我在我的xib文档中使用UIToolbar,它会强制我放在UIToolbar上的所有内容都是UIBarButtonItem,而这种不幸的大小效应就是它创建的不需要的填充。注意将UIViews添加到图像中的UIToolbar时可以看到的红色条纹(看看红色是多么丑陋!):

UIToolbar with red bar tint

我相信我已经在Xcode的Inspector面板中设置了所有必要的设置和IBOutlets。并且使用简单的居中x,y布局约束。

更新1:

如果我将UIView添加到UIToolbar,我将会遇到UIToolbar的视图层次结构> UIBarButtonItem> UIView的。选择UIView并读取Xcode右侧面板上的Size Inspector,您将看到类似于以下内容的内容:

enter image description here

这有一个不可用的副作用(UIView左边16点,顶面6点)。虽然有足够大的UIView,但是顶部的6个点可以重新获得,但是左边的16个不能。再次注意顶部图像中的红色边距。

更新2:

现在我的新解决方案已修复了16点的任何UIView偏移。

3 个答案:

答案 0 :(得分:4)

我找到了你的问题。

您的问题,您在.XIB中使用UIView代替UIToolbar

按照以下步骤操作。

1)您需要从 XIB 文件中删除 UIView 。和添加UIToolbar 代替UIVIew。

enter image description here

2)将标识分配给XIB CustomToolbar.swift

enter image description here

3)现在将 IBOutlet 设置为 CustomToolbar.swift

中的项目

enter image description here

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。

enter image description here

我希望此信息对您有所帮助。

答案 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! 
}