🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

UI

UIはUser Interfaceの略であり、人間がコンピュータとやりとりをするためのシステムです。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

iPhone

iPhoneとは、アップル社が開発・販売しているスマートフォンです。 同社のデジタルオーディオプレーヤーiPodの機能、電話機能、インターネットやメールなどのWeb通信機能の3つをドッキングした機器です。

Q&A

解決済

2回答

9549閲覧

【Swift】アプリをビルドした際に画面が真っ黒になる(Storyboard不使用)

ysda

総合スコア65

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

UI

UIはUser Interfaceの略であり、人間がコンピュータとやりとりをするためのシステムです。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

iPhone

iPhoneとは、アップル社が開発・販売しているスマートフォンです。 同社のデジタルオーディオプレーヤーiPodの機能、電話機能、インターネットやメールなどのWeb通信機能の3つをドッキングした機器です。

0グッド

0クリップ

投稿2019/11/20 09:33

前提・実現したいこと

Storyboard,xibを使用せずにコードのみでアプリを作成しようとしているのですが、
アプリを立ち上げた際に画面が真っ黒の状態になってしまいます。
こちらの解決方法についてご教示いただければ幸いです。

発生している問題・エラーメッセージ

Storyboard 抜きで、コードオンリーで iOS アプリの UI を作る
こちらの記事のソースコードをそのまま使って作成してみたのですが、アプリを立ち上げると真っ黒の状態になってしまいました。
デバックエリアには以下のように表示されておりました。

NoStoryBoard[15434:452943] [WindowScene] Failed to instantiate the default view controller for UIMainStoryboardFile 'Main' - perhaps the designated entry point is not set?

RootviewControllerの設定の部分でうまくいっていないせいだとは思うのですが、どのように修正すれば良いのかがわからない状態です。
知恵をお貸しいただければと思います。

ソースコード

AppDelegate

1import UIKit 2 3@UIApplicationMain 4class AppDelegate: UIResponder, UIApplicationDelegate { 5 6 var window: UIWindow? 7 private(set) lazy var viewController = ViewController() 8 9 func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { 10 self.window = UIWindow(frame: UIScreen.main.bounds) 11 self.window?.makeKeyAndVisible() 12 self.window?.rootViewController = viewController 13 14 return true 15 } 16 17 func application(_ application: UIApplication, configurationForConnecting connectingSceneSession: UISceneSession, options: UIScene.ConnectionOptions) -> UISceneConfiguration { 18 return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role) 19 } 20 21 func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set<UISceneSession>) { 22 23 } 24}

ViewController

1import UIKit 2 3class ViewController: UIViewController { 4 5 override func viewDidLoad() { 6 super.viewDidLoad() 7 // Do any additional setup after loading the view. 8 9 let mainView = MainView(frame: self.view.bounds) 10 mainView.autoresizingMask = [.flexibleWidth, .flexibleHeight] 11 self.view.addSubview(mainView) 12 13 } 14} 15

MainView

1import UIKit 2 3class MainView: UIView { 4 5 let mainLabel: UILabel 6 7 override init(frame: CGRect) { 8 self.mainLabel = UILabel() 9 self.mainLabel.text = "Hello World!" 10 self.mainLabel.textAlignment = .center 11 super.init(frame: frame) 12 self.backgroundColor = .white 13 self.addSubview(mainLabel) 14 } 15 16 required init?(coder: NSCoder) { 17 fatalError("init(coder:) has not been implemented") 18 } 19 20 override func layoutSubviews() { 21 super.layoutSubviews() 22 let labelSize = self.mainLabel.sizeThatFits(self.bounds.size) 23 let x = (self.bounds.width - labelSize.width) / 2 24 let y = (self.bounds.height - labelSize.height) / 2 25 let labelOrigin = CGPoint(x: x, y: y) 26 self.mainLabel.frame = CGRect(origin: labelOrigin, size: labelSize) 27 } 28} 29

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

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

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

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

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

guest

回答2

0

ベストアンサー

iOS13からSceneDelegateという機構が入ったいので、昔の書き方では表示されなくなったらしいです。

コードでのWindowやViewControllerの生成方法についても、以下に触れられていましたので、見てみてはいかがでしょうか。

参考:
iOS13のSceneDelegate周りのアプリの起動シーケンス
https://qiita.com/omochimetaru/items/31df103ef98a9d84ae6b

投稿2019/11/21 01:33

takabosoft

総合スコア8356

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

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

ysda

2019/11/21 02:08 編集

ご回答ありがとうございます。 色々と調べている最中に、私もそちらの記事にヒットしまして、その後 https://teratail.com/questions/214822 上記質問にヒットし、本質問と同様の内容だったため、こちらを参考にして解決いたしました。
guest

0

こちらの質問を参考にし、解決いたしました。
ご回答にもあるように、Storyboardを削除してコードでのUI作成を行う場合、AppDelegateではなく、SceneDelegateを使用するみたいです。
以下にコードを記述します。
なお質問部分に記載したViewControllerとMainViewはそのままで、AppDelegateはデフォルトの状態という前提です。

SceneDelegate

1 2//省略 3var window: UIWindow? 4 5 let viewController = ViewController() 6 7 func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) { 8 // Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`. 9 // If using a storyboard, the `window` property will automatically be initialized and attached to the scene. 10 // This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead). 11 12 guard let _ = (scene as? UIWindowScene) else { return } 13 14 if let windowScene = scene as? UIWindowScene { 15 let window = UIWindow(windowScene: windowScene) 16 window.rootViewController = ViewController(nibName: nil, bundle: nil) 17 self.window = window 18 window.makeKeyAndVisible() 19 } 20 21 } 22 23//以下省略

また、TARGETSのInfoにあるStoryboardNameを削除する必要もあるみたいです。

イメージ説明

こちらを行うことで、以下のようにラベルを画面に表示させることができるようになりました。

イメージ説明

投稿2019/11/21 02:21

編集2019/11/21 02:27
ysda

総合スコア65

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問