这就是我如何定制我的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)发布于 2015-07-27 17:30:44
正如我在评论中所写的。UIView只能有一个超级视图。如果您第二次将其添加为子视图,则将其从第一个超级视图中删除,然后添加到新的超级视图中。检查addSubview...文档:
视图只能有一个超级视图。如果视图已经有了一个superview,并且该视图不是接收方,则此方法在使接收方成为新的superview之前删除以前的superview。
它并没有被取消。它刚刚从您的第一个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)
}
}即使您使用UIImages,也不要害怕。UIImages被缓存、共享、.一个图像在内存中不是多次的,只有一次。谈论UIImage & init?(named name: String)。
在每个UIViewController中,只需使用UIBarButtonItem.myBarButtonItem()即可。wrapperView、imageView和一个UIImage的多个实例。
https://stackoverflow.com/questions/31648963
复制相似问题