UIBarButtonItemの初期化がなんかおかしい
自己解決しました。(追記を参照)
別に特別なことしてないんだけど、なんかおかしいことになったのでメモ。
追記 2018/05/10
別に、おかしくなかったです。
weakなメンバーに代入してるので、
代入時に破棄されてたとか、そういうお話。
なので、weakを取り除いたら、普通に動きました。
— ここまで追記 —
やりたいことは、画面下にこんな感じのUIを配置したい。

これはうまくいく。
class ViewController: UIViewController {
weak var openButton: UIBarButtonItem!
weak var cameraButton: UIBarButtonItem!
weak var actionButton: UIBarButtonItem!
weak var saveButton: UIBarButtonItem!
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
let toolBar: UIToolbar = self.view.subviews[0] as! UIToolbar
let items: [UIBarButtonItem] = [
UIBarButtonItem(
barButtonSystemItem: .fixedSpace, target: nil, action: nil ),
UIBarButtonItem(
barButtonSystemItem: .organize, target: self, action: #selector(ViewController.openButtonTapped(_:)) ),
UIBarButtonItem(
barButtonSystemItem: .flexibleSpace, target: nil, action: nil ),
UIBarButtonItem(
barButtonSystemItem: .camera, target: self, action: #selector(ViewController.cameraButtonTapped(_:)) ),
UIBarButtonItem(
barButtonSystemItem: .flexibleSpace, target: nil, action: nil ),
UIBarButtonItem(
barButtonSystemItem: .action, target: self, action: #selector(ViewController.actionButtonTapped(_:)) ),
UIBarButtonItem(
barButtonSystemItem: .flexibleSpace, target: nil, action: nil ),
UIBarButtonItem(
barButtonSystemItem: .save, target: self, action: #selector(ViewController.saveButtonTapped(_:)) ),
UIBarButtonItem(
barButtonSystemItem: .fixedSpace, target: nil, action: nil )
]
items.first!.width = 10.0
items.last!.width = 10.0
self.openButton = items[1]
self.cameraButton = items[3]
self.actionButton = items[5]
self.saveButton = items[7]
toolBar.setItems( items, animated: false )
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
@objc func openButtonTapped(_: AnyObject?) {
print( "openButtonTapped!" )
}
@objc func cameraButtonTapped(_: AnyObject?) {
print( "cameraButtonTapped!" )
}
@objc func actionButtonTapped(_: AnyObject?) {
print( "actionButtonTapped!" )
}
@objc func saveButtonTapped(_: AnyObject?) {
print( "saveButtonTapped!" )
}
}
最初はどうしてたかというと、こんな感じ。
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
let toolBar: UIToolbar = self.view.subviews[0] as! UIToolbar
self.openButton = UIBarButtonItem(
barButtonSystemItem: .organize, target: self, action: #selector(ViewController.openButtonTapped(_:)) )
self.cameraButton = UIBarButtonItem(
barButtonSystemItem: .camera, target: self, action: #selector(ViewController.cameraButtonTapped(_:)) )
self.actionButton = UIBarButtonItem(
barButtonSystemItem: .action, target: self, action: #selector(ViewController.actionButtonTapped(_:)) )
self.saveButton = UIBarButtonItem(
barButtonSystemItem: .save, target: self, action: #selector(ViewController.saveButtonTapped(_:)) )
let leftPadding = UIBarButtonItem(
barButtonSystemItem: .fixedSpace, target: nil, action: nil )
let rightPadding = UIBarButtonItem(
barButtonSystemItem: .fixedSpace, target: nil, action: nil )
leftPadding.width = 10.0
rightPadding.width = 10.0
toolBar.setItems( [
leftPadding,
self.openButton,
UIBarButtonItem(
barButtonSystemItem: .flexibleSpace, target: nil, action: nil ),
self.cameraButton,
UIBarButtonItem(
barButtonSystemItem: .flexibleSpace, target: nil, action: nil ),
self.actionButton,
UIBarButtonItem(
barButtonSystemItem: .flexibleSpace, target: nil, action: nil ),
self.saveButton,
rightPadding
], animated: false )
}
でも、これだと25行目あたりの、
self.openButtonの中身はnilなのだ。
よく分かんないで、詳しい人に聞く時のために記事にしました。
おしまい。
Leave a Comment