swift 数组不包含实例变量
Posted
技术标签:
【中文标题】swift 数组不包含实例变量【英文标题】:swift array won't contain instance variables 【发布时间】:2014-07-28 15:31:44 【问题描述】:import UIKit
class KeyboardViewController: UIInputViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate
@IBOutlet var nextKeyboardButton: UIBarButtonItem
var statusLabel: UILabel = UILabel()
var bottomBar : UIToolbar = UIToolbar()
var globeIcon : UIImage = UIImage(named: "globe-hover.png")
@IBOutlet var captureButton : UIBarButtonItem
@IBOutlet var libraryButton : UIBarButtonItem
override func viewDidLoad()
super.viewDidLoad()
self.statusLabel.text="viewDidLoad() called"
// Perform custom UI setup here
self.nextKeyboardButton = UIBarButtonItem(image: self.globeIcon, style: .Plain , target: self, action: "advanceToNextInputMode")
self.captureButton = UIBarButtonItem(title: "Take Photo", style: .Plain, target: self, action: "captureClicked")
self.libraryButton = UIBarButtonItem(title: "Library", style: .Plain, target: self, action: "libraryClicked")
self.statusLabel.setTranslatesAutoresizingMaskIntoConstraints(false)
self.statusLabel.sizeToFit()
var barItems : [UIBarButtonItem] = [self.nextKeyboardButton, self.captureButton, self.libraryButton]
self.bottomBar.items = barItems
self.view.addSubview(self.bottomBar)
self.view.addSubview(self.statusLabel)
var statusLabelLeftSideConstraint = NSLayoutConstraint(item: self.statusLabel, attribute: .Right, relatedBy: .Equal, toItem: self.view, attribute: .Right, multiplier: 1.0, constant: 0.0)
var statusLabelBottomConstraint = NSLayoutConstraint(item: self.statusLabel, attribute: .Top, relatedBy: .Equal, toItem: self.view, attribute: .Top, multiplier: 1.0, constant: 0.0)
self.view.addConstraints([statusLabelLeftSideConstraint, statusLabelBottomConstraint])
每次运行此程序时,我都会收到运行时错误:“致命错误:在展开可选值时意外发现 nil”,指的是位 var barItems : [UIBarButtonItem] = [self.nextKeyboardButton, self.captureButton, self.libraryButton]
,并且调试器指出 barItems
是一个空数组 (nil)。
这里发生了什么?为什么数组 barItems 不包含我的实例 UIBarButtonItem 变量?似乎 UIBarButtonItem 类型变量(captureButton、libraryButton 和 nextKeyboardButton)本身是 nil,但为什么呢?提前致谢!
【问题讨论】:
要让 barItems 数组接受 nil 值,请将类型更改为[UIBarButtonItem?]
。然后,您需要在使用 if let concreteItem = barItems[n] . code when not nil . else . code when nil .
构造之前显式检查每个数组项以查看它是否为 nil。
提示:在 viewWillAppear 中创建数组。
【参考方案1】:
由于目标 C 指针不具有 swift 提供的相同类型安全性这一事实,许多来自目标 C 的对象都是隐式展开的可选项。
您在这一行收到错误,因为类型 [UIBarButtonItem]
不允许数组中包含 nil 值,并且您放入数组中的某些值是 nil
。 p>
var barItems : [UIBarButtonItem] = [self.nextKeyboardButton, self.captureButton, self.libraryButton]
为了使调试更简单,我要做的第一件事是向这些值的原始实例添加类型(您不希望是nil
):
self.nextKeyboardButton : UIBarButtonItem = UIBarButtonItem(image: self.globeIcon, style: .Plain , target: self, action: "advanceToNextInputMode")
self.captureButton : UIBarButtonItem = UIBarButtonItem(title: "Take Photo", style: .Plain, target: self, action: "captureClicked")
self.libraryButton : UIBarButtonItem = UIBarButtonItem(title: "Library", style: .Plain, target: self, action: "libraryClicked")
objective-c 中的一些初始化器返回 nil 表示初始化失败,也许这里就是这种情况?如果是,则添加类型注释后会出现不同的错误。你能发布那个错误吗?
【讨论】:
在做一些测试之后,项目的初始化程序肯定会返回nil
导致所有问题。在 viewDidLoad() 方法之前实例化它们之后,我得到了第二个和第三个 UIBarButtonItems 的错误 'viewController.Type' does not have a member named 'globeIcon'
和 Missing argument for parameter 'landscapeImagePhone' in call
。检查文档后,我不应该提供那个论点,所以我不明白那里有什么问题。我也不明白globeIcon 的问题。有什么见解吗?
当我错误地将 [UIBarButtonItem] 分配给 navigationItem.rightBarButtonItem(而不是 rightBarButtonItems)时,我得到了“在调用中缺少参数 'landscapeImagePhone' 的参数”,呵呵!以上是关于swift 数组不包含实例变量的主要内容,如果未能解决你的问题,请参考以下文章
将从@escaping接收的值分配给swift中另一个类中的实例变量