質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Cocoa

CocoaはMac OS X用のアプリケーションを構築する為の主要なフレームワークのひとつです。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

解決済

1回答

644閲覧

設定情報ファイルを読み書きするプログラムの設計

workr

総合スコア158

Cocoa

CocoaはMac OS X用のアプリケーションを構築する為の主要なフレームワークのひとつです。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2017/10/26 04:08

Swift(Xcode 9.01)で各種環境設定をファイル保存する Mac アプリケーションを作っています。
ウィンドウの位置や最前面に表示するか、配色などのコンフィグを保存しておいて、次回起動時に同じ状態で起動できるようにするのが目的です。

Swift プログラミング自体不慣れでクラスのもたせ方がよくわからないため、どのように設計したらいいのか見当がついていません。

ひとまず Config クラスを作り、メソッド save() で設定ファイルの保存、load() で設定ファイル(XML)の読み込みができるようにしました。読み書きする情報はすべて Config のプロパティとして保持しています。(Config.windowX, Config.topmost など)

使うにはインスタンス化しなければなりませんがまずどこにそれを書いてよいのかわかりません。とりあえず AppDelegate.swift のプロパティに持たせ、 override init() 時にインスタンス化することにしました。

swift

1class AppDelegate: NSObject, NSApplicationDelegate { 2 var config:Config? 3 4 override init(){ 5 super.init() 6 self.config = Config() 7 self.config.load() 8 } 9}

NSViewController などからこのデータにアクセスしたいのですが AppDelegate クラスにアクセスする手段を知りません。根本から間違っているのかもしれません。

設定情報を管理するクラスを作る場合どこでインスタンス化し、どのようにアクセスすればいいのでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

決まりがあるわけではありませんが、僕は次の2つのどちらかを使っています。最近はもっぱら下です。

swift

1 2extension NSApplication { 3 var appDelegate: AppDelegate { return delegate as! AppDelegate } 4} 5 6extension AppDelegate { 7 static var shared: AppDelegate { return NSApplication.shared.delegate as! AppDelegate } 8}

設定のロードにはapplicationWillFinishLaunching(_:)あるいはapplicationDidFinishLaunching(_:)を使っ方がいいかもしれません。

(追記)
Main.xibなど起動時に読み込まれるnibにWindowなどがある場合、そちらのwindowDidLoad()などが先に呼ばれます。
この場合はawakeFromNib()が利用できます。
ただし、awakeFromNib()は複数回呼ばれる可能性がありますので予防措置が必要です。
この場合はconfigがnilの時だけloadするようにすればいいと思います。
(追記ここまで)

(さらに追記)
Swiftらしい代案を思いつきましたので追記しておきます。

swift

1class AppDelegate: NSObject, NSApplicationDelegate { 2 lazy var config: Config = { 3 let config = Config() 4 config.load() 5 return config 6 }() 7 8 .... 9}

設定の保存にはUserDefaultsを調べてみるといいかもしれません。
ただ、UserDefaultsには保存できる型というのが決まっていてそれ以外を保存しようとすると若干面倒くさい処理が必要になります。
最近はUserDefaultsをSwiftで簡単に扱うライブラリもいろいろ出ているのでそれらを使えばあまり深く考える必要なく使えます。

投稿2017/10/26 05:12

編集2017/10/26 08:22
MasakiHori

総合スコア3384

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

workr

2017/10/26 07:36

コメントありがとうございます。おそらくこちらの実装に問題があるのだと思いますが、applicationWillFinishLaunching()でコンフィグの読み込みを行った際、ビルドは成功するもののViewControllerのviewDidAppear() でコンフィグのプロパティを読み取ろうとした際に EXC_BAD_INSTRUCTION エラーが発生してしまいます。発生時に appDelegate は取得できているようですが appDelegate.config が nil になっていました。applicationWillFinishLaunching()より先にviewDidAppear() が実行されているようでしたが何か解決策はあるのでしょうか?
MasakiHori

2017/10/26 08:08

追記し忘れましたが、UIなどへのアクセスが生じないのであればinitでロードしても問題ないです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問