Creating a macOS APP (macOSアプリの作成)

11月 12, 2020

iPhone向けに作ったLandmarkアプリを、macOSでも動作するように追加・変更していきます。


目次

Creating a macOS APP

watchOS用のランドマークアプリのバージョンを作成したら、次はもっと大きなもの、つまりMacにランドマークを導入することに焦点を当てます。これまでに学んだすべてを基にして、iOS、watchOS、およびmacOS用のSwiftUIアプリを構築するエクスペリエンスを完成させます。

まず、macOSターゲットをプロジェクトに追加し、iOSアプリ用に作成した共有データを再利用します。すべてのアセットを配置したら、SwiftUIビューを作成して、macOSでリストビューと詳細ビューを表示します。

完成版

プレビューでエラー

ContentView.swift を新規作成してプレビューする項目で、エラーが発生してプレビューできませんでした。

NoBuildableEntriesError: active scheme does not build this file

Select a scheme that builds a target which contains the current file, or add this file to a target that is built by the current scheme.

ネットで検索すると、以下のような対応をすると解消したというコメントがあったため実施しましたが、解決しませんでした。

  • iCloudにファイルが保存されている場合はローカルにする
  • プロジェクトを開き直す
  • 本課題の完成版のプロジェクト Complete でもプレビューエラーは発生

一旦諦めて、次のセクションで、新規にLandmarkRow.swiftを追加したところ、こちらはプレビューができました。ただし、プレビューを繰り返したり、他のソースでプレビューを行おうとするとエラーになります。

何か明確な原因があるというより、動作が不安定な気がします。

実行環境は、次の通りです。

macOS Catalina 10.15.3 
Xcode 11.4.1

プラットフォーム別のアプリを共存させるために

画像やアプリケーションの基本動作は共有することが多いですが、デバイス(I/Fや大きさ)やFWの違いを吸収するために、C言語のように#if でコードを明確に分けることもあります。

#if os(macOS)

extension MapView: NSViewRepresentable {
    func makeNSView(context: Context) -> MKMapView {
        makeMapView()
    }
    
    func updateNSView(_ nsView: MKMapView, context: Context) {
        updateMapView(nsView, context: context)
    }
}

#else

extension MapView: UIViewRepresentable {
    func makeUIView(context: Context) -> MKMapView {
        makeMapView()
    }
    
    func updateUIView(_ uiView: MKMapView, context: Context) {
        updateMapView(uiView, context: context)
    }
}

#endif