首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当在其他customView中使用相同的子视图时,UIBarButtonItem中my UIBarButtonItem的子视图消失

当在其他customView中使用相同的子视图时,UIBarButtonItem中my UIBarButtonItem的子视图消失
EN

Stack Overflow用户
提问于 2015-07-27 09:04:26
回答 1查看 263关注 0票数 1

这就是我如何定制我的UIBarButtonItem

代码语言:javascript
复制
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)时,它是黄色的。看起来绿色的子视图被取消了。为什么?

以下是我如何保存对绿色视图的引用:

代码语言:javascript
复制
class DBAppSettings: NSObject {
    static var imageViewForCartBarButtonItem: UIImageView!
}

注意事项

当我在本地保持绿色眼镜片时,一切都很好:

代码语言:javascript
复制
let green = UIImageView(frame: CGRectMake(5, 5, 30, 30))
green.backgroundColor = UIColor.greenColor()

wrapperView.addSubview(green)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-07-27 17:30:44

正如我在评论中所写的。UIView只能有一个超级视图。如果您第二次将其添加为子视图,则将其从第一个超级视图中删除,然后添加到新的超级视图中。检查addSubview...文档:

视图只能有一个超级视图。如果视图已经有了一个superview,并且该视图不是接收方,则此方法在使接收方成为新的superview之前删除以前的superview。

它并没有被取消。它刚刚从您的第一个wrapperView中删除。

您可以使用自定义工厂方法,如下所示:

代码语言:javascript
复制
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()即可。wrapperViewimageView和一个UIImage的多个实例。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31648963

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档