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