質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.35%
クラッシュ

クラッシュ(crash)はプログラムを完全に停止させてしまう修復不可能なエラー結果を指します。

Xcode

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

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Q&A

1回答

2641閲覧

ビューが表示されてからの経過時間を取得し、画面表示させようと試みたところクラッシュしてしまい困っています

chichan666

総合スコア5

クラッシュ

クラッシュ(crash)はプログラムを完全に停止させてしまう修復不可能なエラー結果を指します。

Xcode

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

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

0グッド

0クリップ

投稿2020/03/05 05:42

編集2020/03/05 14:48

前提・実現したいこと

こんにちは!SwiftUI初心者です。
ビューが表示されてからの経過時間を取得し、画面表示する機能を実装しようとしています。
下記コードにて実行しようとしたところ、Clashしてしまいました。(必要箇所のみ抜粋しております)
助けていただけると大変助かります。
よろしくお願いいたします。

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

エラーメッセージはありませんが、プレビューしようとするとClashしてしまいます。

該当のソースコード

import SwiftUI import UIKit import Combine //ビューが表示されてからの経過時間を画面表示するビュー struct ContentView: View { @EnvironmentObject var timerHolder : TimerHolder var body: some View { ZStack { Text(String(self.timerHolder.count)) }.onAppear{ self.timerHolder.start() }.onDisappear{ } } //body } //ContentlView //画面が表示されてからの時間をカウントする class TimerHolder : ObservableObject { @Published var timer : Timer! @Published var count = 0 @Published var timeup:Bool = false func start() { self.timer?.invalidate() self.count = 0 self.timer = Timer.scheduledTimer(withTimeInterval: 0.01, repeats: true) { _ in self.count += 1 if(self.count==500){self.timeup=true} } } } //プレビュー struct ContentView_Previews: PreviewProvider { static var previews: some View { ContentView() } }

試した事

その後、下記のようにコードを修正しても同じくClashしてしまいました。

import SwiftUI import UIKit import Combine //ビューが表示されてからの経過時間を画面表示するビュー struct ContentView: View { @EnvironmentObject var timerHolder : TimerHolder var body: some View { ZStack { Text(String(self.timerHolder.count)) }.onAppear{ self.timerHolder.start() }.onDisappear{ } } //body } //ContentlView //画面が表示されてからの時間をカウントする class TimerHolder : ObservableObject { @Published var timer : Timer! @Published var count = 0 @Published var timeup:Bool = false func start() { self.timer?.invalidate() self.count = 0 self.timer = Timer.scheduledTimer(withTimeInterval: 0.01, repeats: true) { _ in self.count += 1 if(self.count==500){self.timeup=true} } } } //プレビュー struct ContentView_Previews: PreviewProvider { static var previews: some View { ContentView() } }

補足情報(FW/ツールのバージョンなど)

Xcode ver : 11.3
最終的には一定時間経過後に自動で画面が次々と切り替わっていく機能を実装したいと考えております。

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

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

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

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

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

guest

回答1

0

クラッシュする場合はコンソールにメッセージが表示されているはずです。その情報を使うと問題を特定しやすいです。

一つ目のコードをコピーして実行したところ、数字がカウントアップされていく画面が表示されましたので、提示されている部分には問題はないのではないかと思います。

推定ですが、SceneDelegate.swiftに以下のようなコードがあると思います。

swift

1 if let windowScene = scene as? UIWindowScene { 2 let window = UIWindow(windowScene: windowScene) 3 window.rootViewController = UIHostingController(rootView: contentView) 4 self.window = window 5 window.makeKeyAndVisible() 6 }

ここで以下のように、environmentObjectを渡す必要があるのですが、そのようになっていますでしょうか。

swift

1 if let windowScene = scene as? UIWindowScene { 2 let window = UIWindow(windowScene: windowScene) 3 window.rootViewController = UIHostingController(rootView: contentView.environmentObject(TimerHolder())) 4 self.window = window 5 window.makeKeyAndVisible() 6 }

投稿2020/03/09 12:43

eytyet

総合スコア803

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

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

chichan666

2020/03/11 11:50

ご回答ありがとうございます! SceneDelegate.swiftも修正したのですが、やはりクラッシュしてしまいました。 ご参考になるか分かりませんが、Diagnosticsを行うと以下メッセージが表示されました。 --------------- Error Domain=com.apple.dt.ultraviolet.service Code=12 "Rendering service was interrupted" UserInfo={NSLocalizedDescription=Rendering service was interrupted} ------------------ eytyetさんの環境では正常に動作しているとの事ですので、再度自分の環境を見直してみます!
eytyet

2020/03/11 12:10

Diagnosticsはプレビュー画面のエラーを見る機能で、シミュレーターや実機動作でのエラーとは異なります。 もともと問題となっているクラッシュは、シミュレーター動作でのことでしょうか。私が動作を確認したのはシミュレーターでの実行結果です。プレビューはエラーになっています。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問