将 UIBarButtonItem 转换为 UIButton
Casting a UIBarButtonItem to a UIButton
如果我想将 UIToolbar 项转换为 UIBarButtonItem,XCode 让我这样写:
for item in toolBar!.items as! [UIBarButtonItem]! {
// Do something
}
但是,一旦它这样做,它就会说
"Forced cast from '[UIBarButtonItem]?' to '[UIBarButtonItem]' only unwraps optionals; did you mean to use '!'?"
那么,如何将上述转换写入 UIBarButtonItem 而不 XCode 显示任何 errors/warnings?
您可以使用 if let
进行安全类型转换。
if let items = toolBar.items {
for item in items {
if let btn = item as? UIButton {
print("'btn' is UIButton.")
} else {
print("It is not UIButton.")
}
}
}
你可以检查是否有项目然后做一个foreach。
// check if toolBar have any items
guard let items = toolBar.items else { return }
// then do a loop with items
for item in items {
// do something
}
你也可以用??提供默认值
// provide an empty array if items where nil
for item in toolBar.items ?? [] {
// do something
}
你的警告是说你没有改变 class(类型转换),而只是 force-unwrapping。在您的情况下,toolBar!.items
是 [UIBarButtonItem]?
的一种类型,您正在将其转换为 [UIBarButtonItem]
,这可以简单地通过说 toolBar!.items!
.
来完成
但这与您在标题中提到的UIButton
无关。并且您不能将 UIBarButtonItem
类型转换为 UIButton
。两者之间有很大的区别,因为 UIBarButtonItem
实际上是创建按钮的指令,而不是按钮本身。如果您确实需要获取该按钮,则需要使用 UIBarButtonItem(customView: )
将其添加为自定义视图,然后将其提取为 item.customView as? UIButton
.
var items: [UIBarButtonItem]? { get set }
是UIBarButtonItem
的可选数组,不需要强制转换。这就是警告所说的。
只要安全地检查是否有物品,UIButton
根本不涉及
if let bar = toolBar, let items = bar.items {
for item in items {
// Do something
}
}
但是,如果工具栏及其项目是在 Interface Builder 中设计的并且不会在运行时更改,您可以强制展开两者。
for item in toolBar!.items! {
// Do something
}
没有任何 if / guard let 或 force unwrapping 的简单方法是使用 forEach
代替:
toolbar.items?.forEach { item in
// do whatever you want
}
如果我想将 UIToolbar 项转换为 UIBarButtonItem,XCode 让我这样写:
for item in toolBar!.items as! [UIBarButtonItem]! {
// Do something
}
但是,一旦它这样做,它就会说
"Forced cast from '[UIBarButtonItem]?' to '[UIBarButtonItem]' only unwraps optionals; did you mean to use '!'?"
那么,如何将上述转换写入 UIBarButtonItem 而不 XCode 显示任何 errors/warnings?
您可以使用 if let
进行安全类型转换。
if let items = toolBar.items {
for item in items {
if let btn = item as? UIButton {
print("'btn' is UIButton.")
} else {
print("It is not UIButton.")
}
}
}
你可以检查是否有项目然后做一个foreach。
// check if toolBar have any items
guard let items = toolBar.items else { return }
// then do a loop with items
for item in items {
// do something
}
你也可以用??提供默认值
// provide an empty array if items where nil
for item in toolBar.items ?? [] {
// do something
}
你的警告是说你没有改变 class(类型转换),而只是 force-unwrapping。在您的情况下,toolBar!.items
是 [UIBarButtonItem]?
的一种类型,您正在将其转换为 [UIBarButtonItem]
,这可以简单地通过说 toolBar!.items!
.
但这与您在标题中提到的UIButton
无关。并且您不能将 UIBarButtonItem
类型转换为 UIButton
。两者之间有很大的区别,因为 UIBarButtonItem
实际上是创建按钮的指令,而不是按钮本身。如果您确实需要获取该按钮,则需要使用 UIBarButtonItem(customView: )
将其添加为自定义视图,然后将其提取为 item.customView as? UIButton
.
var items: [UIBarButtonItem]? { get set }
是UIBarButtonItem
的可选数组,不需要强制转换。这就是警告所说的。
只要安全地检查是否有物品,UIButton
根本不涉及
if let bar = toolBar, let items = bar.items {
for item in items {
// Do something
}
}
但是,如果工具栏及其项目是在 Interface Builder 中设计的并且不会在运行时更改,您可以强制展开两者。
for item in toolBar!.items! {
// Do something
}
没有任何 if / guard let 或 force unwrapping 的简单方法是使用 forEach
代替:
toolbar.items?.forEach { item in
// do whatever you want
}