74330
macOS catalina 未満と以降で振る舞いを変えたく、ツールバーにアイテムをコードで生成したいのですが、

`WindowController`を`NSTollbar`の`delegate`に設定し、以下の記述を実装した上で、

```

    public func toolbar(_ toolbar: NSToolbar, itemForItemIdentifier itemIdentifier: NSToolbarItem.Identifier, willBeInsertedIntoToolbar flag: Bool) -> NSToolbarItem?
    
```

`awakeFromNib` で、

```

    insertItem(withItemIdentifier itemIdentifier: NSToolbarItem.Identifier, at index: Int)
    
```

を呼び出すと、ツールバーに直接アイテムが追加されますが、ツールバーのカスタマイズで、表示されるエリアには、上で追加したアイテムが表示されません。

期待するのはこの逆で、ツールバーのカスタマイズで表示される`View`にコードで生成したアイテムが並び、初期状態ではウィンドウのツールバーにはデフォルトアイテムしか表示されない（カスタマイズで任意のアイテムをツールバーに表示できるようにする）

と言うことがしたいのですが、どうすれば実現できるでしょうか？
CC BY-SA 4.0
2021-02-28T02:28:54.587
74308
2021-03-01T04:31:36.953
2021-03-01T04:31:36.953
3060
14745
question
swift macos
アプリケーションのToolbarでカスタマイザブルエリアにアイテムをコードで追加する方法
まず、`extension`で`NSToolbarItem.Identifier`に作成したい`toolbarItem`の`Identifier`を拡張します。

```

    private extension NSToolbarItem.Identifier {
        static let join: NSToolbarItem.Identifier = NSToolbarItem.Identifier(rawValue: "Join")
    
```

更に、`InterfaceBuilder`を使って作った`toolbarItem`には上記のうち、該当するIdentifierを定義します。

次に`WindowContoller`で、`NSTollbarDelegate`を実装し、`Toolbar`の`delegate`を`WindowController`に設定します。そして

```

    func toolbarAllowedItemIdentifiers (_ toolbar: NSToolbar) -> Array<NSToolbarItem.Identifier>
    
```

で、コードで生成したいアイテムを含む、カスタマイザブルエリアに表示したい全ての`Identifier`の配列を返します。

すると、`Identifier`の配列に含まれていて、`toolbar`にまだ追加されていないアイテムを生成するために

```

    func toolbar (_ toolbar: NSToolbar, itemForItemIdentifier itemIdentifier: NSToolbarItem.Identifier, willBeInsertedIntoToolbar flag: Bool) -> NSToolbarItem?
    
```

が呼ばれるので、これを実装し、対応する`ItemIdentifier`のtoolbarItemをコードで生成して関数の戻り値にします。

そうすることで、`Toolbar`のカスタマイザブルエリアにコードで生成したアイテムを追加することが出来ました。
CC BY-SA 4.0
2021-03-01T04:03:02.463
74330
2021-03-01T04:03:02.463
14745
74308
answer