🛩️

SwiftUIを使いつつターゲットOSをiOS11まで下げられるAltSwiftUIでHello, Worldする

2 min read

環境構築

  • Life CycleをSwiftUI AppではなくUIKit App Delegateにしてプロジェクト作成
  • AltSwiftUIをpodインストール
    • $ pod init
    • Podfileにpod 'AltSwiftUI'を追加
    • $ pod install
  • .xcworkspaceプロジェクトファイルを開く

コード修正

AltSwiftUIをimportした時に発生するエラーを消すための作業

  • ContentView.swiftの編集
    • 元々あったSwiftUIは消してライブラリ本体やプロトコルをimport
    ContentView
    - import SwiftUI
    + import AltSwiftUI
    + import protocol SwiftUI.PreviewProvider
    + import protocol AltSwiftUI.View
    
    • ContentViewの編集
      • someを消してviewStoreを定義
      ContentView
      struct ContentView: View {
      +   var viewStore = ViewValues()
      -   var body: some View {
      +   var body: View {
      	Text("Hello, world!")
      	    .padding()
          }
      }
      
    • CotentView_Previewsの編集
      • AltPreviewProviderプロトコルを追加で適合させる
      ContentView
      - struct ContentView_Previews: PreviewProvider {
      + struct ContentView_Previews: AltPreviewProvider, PreviewProvider {
      
      -   static var previews: some View {
      +   static var previewView: View {
      	ContentView()
          }
      }
      
  • AppDelegate.swiftの編集
    • AltSwiftUIのimport
      AppDelegate
      + import AltSwiftUI
      
    • 以下のプロパティを定義
      AppDelegate
      + var window: UIWindow?
      + private var mainController: UIViewController?
      
    • didFinishLaunchingWithOptionsを引数に持つapplication関数内で以下を記述
      AppDelegate
      + window = UIWindow()
      + mainController = UIHostingController(rootView: ContentView())
      + window?.rootViewController = mainController
      + window?.makeKeyAndVisible()
      
  • SceneDelegate.swiftの編集
    • エラーが発生しているscene関数のコードブロックをコメントアウトor消す
  • ここまでで全てのエラーは解消し、ビルドが通ることでPreviewも見れるはず

シミュレーターor実機で動かすために追加のセットアップ

iOS13以降のシミュレーターor実機でアプリを動かす場合はsceneDelegate.swiftで以下のセットアップが必要

  • AltSwiftUIをimport
    SceneDelegate
    + import AltSwiftUI
    
  • 以下のプロパティを定義
    SceneDelegate
    + var window: UIWindow?
    + private var mainController: UIViewController?
    
  • scene関数に以下のコードを追加
    SceneDelegate
    + if let windowScene = scene as? UIWindowScene {
    +     window = UIWindow(windowScene: windowScene)
    +     mainController = UIHostingController(rootView: ContentView())
    +     window?.rootViewController = mainController
    +     window?.makeKeyAndVisible()
    + }
    

ビルドターゲットを下げた時に発生するエラーの対処

  • Hello, Worldの規模であればSceneDelegateクラスの先頭行に@available(iOS 13.0, *)を追加するとファイル全体に発生していたエラーは消える
    • AppDelegateにもエラーが出ている場合は該当コードをコメントアウトする

      iOS12.4のシミュレーターでアプリを実行

Discussion

ログインするとコメントできます