在其他UIBarButtonItem

时间:2015-07-27 09:04:27

标签: ios swift uibarbuttonitem

这是我自定义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后,它看起来不错:

enter image description here

但是当我按下然后从导航堆栈弹出视图控制器(这意味着我使用相同的绿色子视图将其加载到另一个UIBarButtonItem)时,它是黄色的。看起来绿色子视图已取消分配。为什么呢?

enter image description here

这是我保持对绿色子视图的引用的方式:

class DBAppSettings: NSObject {
    static var imageViewForCartBarButtonItem: UIImageView!
}

注意

当我在本地保留绿色子视图时,一切正常:

let green = UIImageView(frame: CGRectMake(5, 5, 30, 30))
green.backgroundColor = UIColor.greenColor()

wrapperView.addSubview(green)

1 个答案:

答案 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()。您wrapperViewimageView和一个UIImage的多个实例。