gpt4 book ai didi

ios - 在 viewDidLoad 中从 Nib 解包 nil 时出现 Swift 错误

转载 作者:可可西里 更新时间:2023-11-01 02:19:00 28 4
gpt4 key购买 nike

得到一些奇怪的结果,我正在加载一个我创建为自定义警报 View 的 nib 文件。但是,当它尝试更改自定义警报 View 中的 UILabel 文本时,它在 viewDidLoad 方法中失败。 (得到展开零错误)

当我转到 nib 文件时,我所有的 socket 都已连接(在它们旁边显示突出显示的点)。文件的所有者也设置为正确的类名。

然而,当代码失败并启动调试器时,所有导出都是空的。这段代码出现在 viewDidAppear 中,所以 socket 和所有 UI 不应该在那个时候加载吗?

辅助信息:另一个奇怪的部分是,我正在两个不同的设备上对此进行测试。一个运行 iOS 8.4,另一个运行 iOS 9.1(测试版)。 iOS 9.1 设​​备运行正常,不会抛出此 nil 错误。 iOS 8.4 设备是引发错误的设备。运行 Xcode 6.4 swift 1.2。为了让代码在我的 iOS 9.1 上运行,我在我的设备连接到计算机的情况下打开 Xcode 7,然后关闭并重新打开 Xcode 6.4,它允许我将我的目标 iOS 设置为 9.1。

更新

代码失败的图片 enter image description here

Nib 文件 View Controller :

@IBOutlet var messageLabel: UILabel!
@IBOutlet var notificationHeightConstraint: NSLayoutConstraint!
@IBOutlet var notificationWidthConstraint: NSLayoutConstraint!
@IBOutlet var singleButton: UIButton!
@IBOutlet var rightButton: UIButton!
@IBOutlet var leftButton: UIButton!
@IBOutlet var middleButtonSpacerView: UIView!

var buttonDelegate: NotificationButtonDelegate?
var grayView: UIView!
var buttonTitles = [String]()
var notificationWidth: CGFloat!
var notificationHeight: CGFloat = 200.0
var hideProgressView = false
var hideNotificationView = false
var currentProgress: CGFloat = 0.0
var messageLabelText = ""


required init(coder aDecoder: NSCoder) {
super.init(coder: aDecoder)
}

override init(nibName nibNameOrNil: String!, bundle nibBundleOrNil: NSBundle!) {
super.init(nibName: nibNameOrNil, bundle: nibBundleOrNil)
}

override func viewDidLoad() {
super.viewDidLoad()
}
override func viewDidAppear(animated: Bool) {
super.viewDidAppear(animated)
messageLabel.text = messageLabelText

if buttonTitles.count > 0 {
if buttonTitles.count == 1 {
rightButton.hidden = true
leftButton.hidden = true
middleButtonSpacerView.hidden = true
singleButton.setTitle("\(buttonTitles[0])", forState: UIControlState.Normal)
} else {
leftButton.setTitle("\(buttonTitles[0])", forState: UIControlState.Normal)
rightButton.setTitle("\(buttonTitles[1])", forState: UIControlState.Normal)
}
}


if self.hideProgressView {
self.progressView.hidden = true
if messageLabel.bounds.height >= 90 {
notificationHeightConstraint.constant = 225
} else {
notificationHeightConstraint.constant = 200.0
}
}

if self.hideNotificationView {
self.notificationView.hidden = true
self.activityIndicator.startAnimating()
notificationHeightConstraint.constant = 160
}

self.notificationWidthConstraint.constant = notificationWidth
self.view.needsUpdateConstraints()

// Do any additional setup after loading the view.

}

主视图 Controller 中的自定义警报 View 类初始化

var notificationPopup: NotificationPopupViewController!
var progressPopup: NotificationPopupViewController!

override func viewDidLoad() {
super.viewDidLoad()
self.hasError = false
notificationPopup = NotificationPopupViewController()
progressPopup = NotificationPopupViewController()

在主 viewController 中调用以呈现自定义警报 View

@IBAction func configureSystemButtonTapped(sender: AnyObject) {

var prefs: NSUserDefaults = NSUserDefaults.standardUserDefaults()
var hostedSSID = prefs.valueForKey("HostedSSID") as? String
var currentSSID = sureVue.getUserSSID()

if currentSSID != hostedSSID || currentSSID == "" {
self.notificationPopup.showInView(self.view, withMessage: "You are not connected to the device's wifi.\nFollow instructions on launch page to connect.", animated: false, buttonLabels: ["Ok"])

nib viewController 中设置自定义警报 View 的方法

    func showInView(aView: UIView!, withMessage message: String!, animated: Bool, buttonLabels:[String]) {
self.hideNotificationView = false
self.hideProgressView = true
self.buttonTitles = buttonLabels
notificationWidth = aView.bounds.width * 0.925
grayView = UIView(frame: aView.frame)
grayView.backgroundColor = UIColor(red: 170/255.0, green: 170/255.0, blue: 170/255.0, alpha: 0.75)
grayView.center = CGPoint(x: aView.bounds.width/2, y: aView.bounds.height/2)
grayView.addSubview(self.view)
self.view.center = CGPoint(x: aView.bounds.width/2, y: aView.bounds.height/2)
aView.addSubview(grayView)
messageLabelText = message


if animated
{
self.showAnimate()
}
}

最佳答案

根据评论,我认为问题在于 self.notificationPopup 的初始化方式。您需要使用 init(nibName: ...),而不是 notificationPopup = NotificationPopupViewController(),以便从 nib 加载实例并设置其导出。

现有代码在 iOS 9 中工作正常,因为 Apple 已经更改了默认的 nibNames,如果您在初始化 UIViewController 时没有指定,则会使用这些默认的 nibNames。请参阅 iOS9 release notes 中 UIKit 下的注释.

关于ios - 在 viewDidLoad 中从 Nib 解包 nil 时出现 Swift 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32765221/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com