ios - 在 Storyboard中使用 Xib 时,Xib 的 IBOutlets 返回 nil

标签 ios swift interface-builder xib nib

我使用 Interface Builder 作为 xib 创建了一个 View 。我这样做是因为我想让用户可以选择将任意数量的这些 View 递增到 View Controller 。我创建了一个 Xib View (名为“TimeRangeView.xib”,创建了一个自定义类(名为“TimeRangeView.swift”)并将 xib 的类设置为此自定义类,将 Storyboard元素连接到 TimeRangeView.swift 的 IBOutlets,设置xib 的文件所有者为 TimeRangeView.swift,并在 View Controller 中将其类设置为我的 TimeRangeView.swift 添加了 View 。enter image description here enter image description here

TimeRangeView.swift:

import UIKit

class TimeRangeView: UIView {
    @IBOutlet var startTimeLabel: UILabel!
    @IBOutlet var startDatePicker: UITextField!
    @IBOutlet var endTime: UILabel!
    @IBOutlet var endDatePicker: UITextField!
    @IBOutlet var addButton: UIButton!
    @IBOutlet var maxTimeLabel: UILabel!



    @IBAction func addButtonPressed(_ sender: UIButton) {

    }
}

我在其中使用的 Storyboard UIViewController 有一个 Interface Builder View 作为 subview ;这个 View 的类被指定为 TimeRangeView.swift。此 View 作为 IBOutlet 连接到 View Controller :

@IBOutlet var timeRangeView: TimeRangeView!

在 View Controller 的 viewDidLoad() 方法中,我想更改 TimeRangeView 的一些 subview (正如我们已经介绍的那样,它们作为 IBOutlets 连接),但是当我尝试更改它们的一些属性时它们返回 nil :

override func viewDidLoad() {
    super.viewDidLoad()
    timeRangeView.maxTimeLabel.text = "Max duration: \(timeString ?? "n/a")"

    //Change the text fields' input views
    let startTimeDatePickerToolBar = UIToolbar().ToolbarPicker(mySelect: #selector(dismissPicker))

    let endTimeDatePickerToolBar = UIToolbar().ToolbarPicker(mySelect: #selector(dismissPicker))

    startTimeDatePicker.setDate(Date(timeIntervalSince1970: NSDate().timeIntervalSince1970 + 60), animated: false)

    endTimeDatePicker.setDate(Date(timeIntervalSince1970: NSDate().timeIntervalSince1970 + 120), animated: false)

    timeRangeView.startDatePicker.inputView = startTimeDatePicker
    timeRangeView.startDatePicker.inputAccessoryView = startTimeDatePickerToolBar
    timeRangeView.startDatePicker.delegate = self

    timeRangeView.endDatePicker.inputView = endTimeDatePicker
    timeRangeView.endDatePicker.inputAccessoryView = endTimeDatePickerToolBar
    timeRangeView.endDatePicker.delegate = self
}

timeRangeView 没有返回 nil;它正在加载。但是当尝试访问 timeRangeView 的 subview (startDatePicker、endDatePicker、maxTimeLabel)时,它们都返回 nil。

我收到的错误是:

Fatal error: Unexpectedly found nil while implicitly unwrapping an Optional value

最佳答案

This is happening Because the xib was never loaded

所以你在这里可以做的是,首先在 viewController 中添加一个简单的 UIView 而不是 TimeRangeView

@IBOutlet var timeRangeContainerView: UIView!

现在在 viewDidLoad 中添加 Fetch the xib by using

let timeRangeView = Bundle.main.loadNibNamed("TimeRangeView", owner: self, options: nil)?[0] as? TimeRangeView

并将其添加为 timeRangeContainerView 的 subview

override func viewDidLoad() {
    super.viewDidLoad()
    let timeRangeView = Bundle.main.loadNibNamed("TimeRangeView", owner: self, options: nil)?[0] as? TimeRangeView

    timeRangeView.frame = CGRect(origin: CGPoint.zero, size: self.timeRangeContainerView.frame.size)

    self.timeRangeContainerView.insertSubview(timeRangeView, at: 0)

    //  Add constraints
    timeRangeView.leadingAnchor.constraint(equalTo: self.leadingAnchor, constant: 10).isActive = true
    timeRangeView.trailingAnchor.constraint(equalTo: self.trailingAnchor, constant: 0).isActive = true
    timeRangeView.topAnchor.constraint(equalTo: self.topAnchor, constant: 0).isActive = true
    timeRangeView.bottomAnchor.constraint(equalTo: self.bottomAnchor, constant: 0).isActive = true
    timeRangeView.translatesAutoresizingMaskIntoConstraints = false  


    //Add the rest of your code here
}

约束是可选的

关于ios - 在 Storyboard中使用 Xib 时,Xib 的 IBOutlets 返回 nil,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55640408/

相关文章:

ios - 如何在Tesseract OCR中设置书写方向?

ios - 对包含多个对象类的 NSArray 进行排序

ios - swift 4.2 枚举案例 ' ' 在类型 '?' 中找不到 switch 语句中的要求以冗余解包隐式解包的可选

ios - UIWebView 未加载页面

xcode - 自动调整 NSButton 的大小以适应以编程方式更改的文本 (Xcode)

objective-c - 与 NSPopupButton 不同,NSArrayController 的 selectedObjects 链接到 NSTableView 选择

ios - iOS Storyboard中表格行高的大小类

ios UILabel 通过 UILabel 大小变化实现动态字体大小变化

ios 5 将导航 Controller 中后退按钮的背景更改为透明

ios - 使用 Swift 在 iOS 应用程序中上传图像作为个人资料照片