Skip to main content

SwiftUIをViewControllerに入れてみた

今回SwiftUIをViewControllerに入れてみた


・現状と背景
そもそもマスタカさんのプロジェクトは、Objective-Cが結構残ってる・・・
ただSwiftUIを入れたいと思ってる
SwiftのViewControllerはあるので、そこにSwiftUIを入れようとと思った

全体の方針は以下
https://dev.classmethod.jp/articles/present-swiftui-view-on-viewcontroller/

 

・SWiftUIのプレビュー
右上のボタンでCanvasを出すと表示される
https://programming-sansho.com/swift/how-to-preview/

 

・ツールバー
NavigationViewって名前になったのでこれを使う
タイトルがデフォルトだと無茶苦茶でかいやつになるので以下を指定する
navigationBarTitle(“aaaa”, displayMode: .inline)
https://software.small-desk.com/development/2020/08/26/swiftui-navigationview-tips/

・閉じるボタン

.navigationBarItems(
    leading: Button(action: {
        //処理
    }){
        Image(systemName: "xmark")
            .foregroundColor(.white)
    }
)

https://ios-docs.dev/swiftui-navigationview/

 

・TableView
ListViewという名前になる
横幅いっぱいにする場合は以下を指定する
.listStyle(.plain)
https://capibara1969.com/2266/

・TableViewの背景色
iOS16以上
scrollContentBackground(Visibility.hidden)
.background(Color(“aaaa”))
iOS16未満
UITableView.appearance().backgroundColor = .clear
https://tech.amefure.com/swift-list-background-color

 

・SwiftUIでOSの出し分け

@ViewBuilder
var iOS16AdaptList: some View {
    if #available(iOS 16.0, *) {
        list
            .scrollContentBackground(Visibility.hidden)
    } else {
        list
    }
}

・SwiftUIでViewの分割

var iOS16AdaptList: some View {
    if #available(iOS 16.0, *) {
        list
            .scrollContentBackground(Visibility.hidden)
    } else {
        list
    }
}

var list: some View {
    List {
        ForEach(0..<menu.count, id: \.self) { _ in
            Text("hogehoge")
        }
    }
}

 

・Non-constant range: argument must be an integer literal
for文にid: \.selfをつける
https://qiita.com/ken_sasaki2/items/b0561957ae0a80b84659

 

・required’ initializer ‘init(coder:)’ must be provided by subclass of ‘UIHostingController
今回ViewControllerにSwiftUIを載せる前提なので
StoryBoardから呼ばれる関数を上書きする必要がある。
ここで指定したSwiftUIのViewがViewController上に表示される

required init?(coder aDecoder: NSCoder) {
    super.init(coder:aDecoder, rootView: SwiftUIView())
}

 

・error build: Command SwiftCompile failed with a nonzero exit
@ViewBuilder
のつけ忘れ。
これPreviewでるから絶対気づかないんだけど・・・・

 

こうしてSwiftUIをViewController上につけれましたとさ

関連記事:

Pocket