【Swift】Storyboardを使わずコードのみでUIKitを使ってiOSアプリを新規作成する方法(Xcode16対応)

アプリ開発

コードのみでStoryboardを使わずにSwiftとUIKitを使ってSwiftコードを新規作成するやり方について解説いたしました。
最近になってSenceDelegate.swiftが新しくできて「swift コードのみ」などと検索してもヒットしなかったり、2024年12月に確認したとこらXcode16.0, Swift 6,0が出ていたりしたので、まとめました。

参考になれば幸いです。

XcodeとSwiftのバージョン

Xcode: Version 16.0
Swift: Version 6.0

完成図

こちらが今回作成したアプリになります。(1つのボタンを実装しただけのシンプルなアプリです)

アプリ実装

プロジェクトの立ち上げ

Xcodeを立ち上げ、Create a new Xcode projectを選択します。

プロジェクトの設定

Producut Nameを選択して好きなアプリネームを入力してNextを選択して保存するフォルダを選択します。
※InterfaceはStoryboad, Life CycleはUIKit App Delegateを選択します。
※Use Core Dataのチェックはどちらでも良いと思います。

Xcode16.0の場合下記のような設定項目のため,SwiftUIでなく下記画像のようにStroyboardと以下のデフォルトの設定をそのまま設定します。

SwiftUIの波が押し寄せてきてますね…

Main.storyboardの削除

ナビゲータエリアのMain.storyboard をプロジェクトから削除します。
(こちらはしなくても良いのですが、削除した方が私はわかりやすいため削除していますmm)

Main Interfaceの設定(Xcode: Version 12.4の場合)

※Xcode 16.0の場合こちらは不要です。

①ナビゲータエリアのアプリ名を選択(この場合上記画像の一番上のTest.APP)
②TARGETS / General / Deployment Info / Main Interfaceを空にします
PROJECTTARGETSとあるTARGETSを選択すると表示)

infoエリア設定

Info設定を実施するために下記アコーディオンメニューを展開して指定の項目を削除します。

①TARGETS / info/ Custom iOS Target Properties / Application Scene Manifest選択②Scene Configuration → Application SessionRole → Item 0(default Configuration)
Storyboard Nameを削除(カーソルを当てると+と-ボタンが出るので-ボタン押下)

Could not find a storyboard named ‘Main’ in bundle のエラー対応

Xcode16の場合ビルドすると下記のようなエラーが表示されます。

Could not find a storyboard named 'Main' in bundle

こちらの対応として‘Main’という設定を削除します。

TARGETS/ Info / Custom iOS Target Properties/ Main storyboard file base nameにカーソルを当てると+と-ボタンが表示されるので-ボタンを押して削除する。

SceneDelegate.swift設定

ここからコードの設定になります。
まず、SceneDelegate.swiftにて初期表示でこうなっているfunc scene()を修正します。

    func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
        // Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`.
        // If using a storyboard, the `window` property will automatically be initialized and attached to the scene.
        // This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead).
        guard let _ = (scene as? UIWindowScene) else { return }
    }


上記コードを下記コードのように修正します。
※あくまで一例で絶対にこれが正しいというわけではありません。

    func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
        //UIwindwosのアンラップ
        guard let windowScene = (scene as? UIWindowScene) else { return }
        
        //アンラップしたものWindwoSceceをselfに設定
        let window = UIWindow(windowScene:  windowScene)
        self.window = window
        
        //ルートビューを選択
        window.rootViewController = ViewController()
        //「window」を最前線に表示する
        window.makeKeyAndVisible()
    }

ViewController.swift設定

最後に、ViewController.swiftviewDidLoad内に下記コードを追加します。

import UIKit
class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        view.backgroundColor = .white
        let button = UIButton(frame: CGRect(x: 100, y: 100, width: 100, height: 100))
        button.backgroundColor = .red
        button.setTitle("Test", for: .normal)
        view.addSubview(button)
        
    }
}

シュミレータで確認

確認としてシュミレータで実行して見ると下記のような結果になりました。

最後に

至ってシンプルな設定かなと思いますが、たまにアップデートがあったりするので、できるだけ更新できればと思います。
何かビルドできない等あればぜひTwitterでメッセージをいただければ修正・対応いたします。

ではまた。

コメント

タイトルとURLをコピーしました