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