这是我自定义UIBarButtonItem
:
if DBAppSettings.imageViewForCartBarButtonItem == nil {
DBAppSettings.imageViewForCartBarButtonItem = UIImageView(frame: CGRectMake(5, 5, 30, 30))
DBAppSettings.imageViewForCartBarButtonItem.backgroundColor = UIColor.greenColor()
}
let wrapperView = UIView(frame: CGRectMake(0, 0, 40, 40))
wrapperView.backgroundColor = UIColor.yellowColor()
wrapperView.addSubview(DBAppSettings.imageViewForCartBarButtonItem)
let cartBarButtonItem = UIBarButtonItem(customView: wrapperView)
我设置UIBarButtonItem
后,它看起来不错:
但是当我按下然后从导航堆栈弹出视图控制器(这意味着我使用相同的绿色子视图将其加载到另一个UIBarButtonItem
)时,它是黄色的。看起来绿色子视图已取消分配。为什么呢?
这是我保持对绿色子视图的引用的方式:
class DBAppSettings: NSObject {
static var imageViewForCartBarButtonItem: UIImageView!
}
注意:
当我在本地保留绿色子视图时,一切正常:
let green = UIImageView(frame: CGRectMake(5, 5, 30, 30))
green.backgroundColor = UIColor.greenColor()
wrapperView.addSubview(green)
答案 0 :(得分:2)
正如我在评论中写的那样。 UIView
只能有一个超级视图。如果您第二次将其添加为子视图,则会将其从第一个超级视图中删除,然后添加到新的超级视图中。查看addSubview...
文档:
视图只能有一个超级视图。如果视图已经有超视图和 该视图不是接收者,此方法删除了以前的 在使接收器成为新的超级视图之前的超视图。
它没有被解除分配。它刚刚从您的第一个wrapperView
中删除。
您可以使用自定义工厂方法,如下所示:
extension UIBarButtonItem {
static func myBarButtonItem() -> UIBarButtonItem {
let imageView = UIImageView(frame: CGRectMake(5,5,30,30))
imageView.backgroundColor = UIColor.greenColor()
let wrapperView = UIView(frame: CGRectMake(0, 0, 40, 40))
wrapperView.backgroundColor = UIColor.yellowColor()
wrapperView.addSubview(imageView)
return UIBarButtonItem(customView: wrapperView)
}
}
即使您使用UIImage
,也不要害怕。 UIImage
被缓存,共享,...一个图像在内存中不是多次,只有一次。谈论UIImage
& init?(named name: String)
。
在每个UIViewController
中,只需使用UIBarButtonItem.myBarButtonItem()
。您wrapperView
,imageView
和一个UIImage
的多个实例。