🎄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++と共存することが意図されています

Q&A

解決済

1回答

1581閲覧

【Swift UI】モーダル表示した画面でtoggleを操作すると,元の画面でstepperを操作した際にモーダル画面が再表示されてしまう

kureid

総合スコア3

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++と共存することが意図されています

0グッド

0クリップ

投稿2021/02/24 12:00

前提・実現したいこと

xcodeでSwiftUIにて某カードゲームのダメージ計算アプリを作成しています.

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

モーダル表示した画面でtoggleを操作すると,元の画面に戻った後でstepperを操作した場合,再度モーダル表示した画面が表示されてしまいます.

該当のソースコード

swift

1import SwiftUI 2 3 4final class ViewModel: ObservableObject { 5 @Published var opponentcondition = [false,false,false,false,false] 6 @Published var owncondition = [false,false,false,false,false] 7} 8 9struct ContentView: View { 10 @State private var opponentdamage = [0,0,0,0,0,0,0,0,0] 11 @State private var owndamage = [0,0,0,0,0,0,0,0,0] 12 @State private var showAlert = false 13 @State private var showcondition = false 14 @State private var coin = "表" 15 16 @ObservedObject var condition = ViewModel() 17 18 19 var body: some View { 20 NavigationView{ 21 Form { 22 Section(header: Text("相手のバトルポケモン")){ 23 Stepper(value: $opponentdamage[0], in: 0...990, step: 10){ 24 Text("(opponentdamage[0], specifier: "%d")") 25 } 26 } 27 Section(header: Text("相手のベンチポケモン")){ 28 Stepper(value: $opponentdamage[1], in: 0...990, step: 10){ 29 Text("(opponentdamage[1], specifier: "%d")") 30 //以下略 31 } 32 } 33 .toolbar{ 34 ToolbarItemGroup(placement: .navigationBarTrailing) { 35 Button("コイントス") { 36 let randomBool = Bool.random() 37 self.showAlert = true 38 39 if randomBool { 40 coin = "表" 41 } 42 else{ 43 coin = "裏" 44 } 45 } 46 Button("状態異常"){ 47 self.showcondition.toggle() 48 } 49 .sheet(isPresented: $showcondition){ 50 ConditionlistView(condition: self.condition) 51 } 52 } 53 } 54 .alert(isPresented: $showAlert) { 55 Alert( 56 title: Text("コイントス結果"), 57 message: Text(coin), 58 dismissButton: .default(Text("OK")) 59 ) 60 } 61 } 62 63 Form { 64 Section(header: Text("自分のバトルポケモン")){ 65 Stepper(value: $owndamage[0], in: 0...990, step: 10){ 66 Text("(owndamage[0], specifier: "%d")") 67 } 68 } 69 70 Section(header: Text("自分のベンチポケモン")){ 71 Stepper(value: $owndamage[1], in: 0...990, step: 10){ 72 Text("(owndamage[1], specifier: "%d")") 73 } 74 //以下略 75 } 76 } 77 } 78} 79 80struct ConditionlistView: View { 81 @ObservedObject var condition: ViewModel 82 83 var body: some View{ 84 Form{ 85 Section(header: Text("相手のバトルポケモン")){ 86 Toggle(isOn: $condition.opponentcondition[0]){ 87 Text("どく") 88 } 89 //以下略 90 } 91 Section(header: Text("自分のバトルポケモン")){ 92 Toggle(isOn: $condition.owncondition[0]){ 93 Text("どく") 94 } 95 //以下略 96 } 97 } 98 } 99} 100 101struct ContentView_Previews: PreviewProvider { 102 static var previews: some View { 103 ContentView() 104 } 105} 106

試したこと

初めてのiosアプリ開発なので,どう対処していいかわからず投稿させていただきました.
「swift モーダル 再表示される」「swift modal reappear」などで,検索はしてみましたが,私では解決策を見つけることができませんでした.

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

iMac bigsur 11.2.1
xcode 12.4
swift 5

アプリ画面の動画を以下のリンクに掲載しました.
https://d.kuku.lu/60e8c5be36

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

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

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

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

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

guest

回答1

0

自己解決

Navigationviewを撤廃し,各種ボタンをFormから独立させたところ,解決いたしました.

コードの変更部分

var body: some View { HStack{ Button("コイントス") { let randomBool = Bool.random() self.showAlert = true if randomBool { coin = "表" } else{ coin = "裏" } } .alert(isPresented: $showAlert) { Alert( title: Text("コイントス結果"), message: Text(coin), dismissButton: .default(Text("OK")) ) } Button("状態異常"){ self.showcondition.toggle() } .sheet(isPresented: $showcondition){ ConditionlistView(condition: self.condition) } } Form {        Section(header: Text("相手のバトルポケモン")){ Stepper(value: $opponentdamage[0], in: 0...990, step: 10){ Text("(opponentdamage[0], specifier: "%d")") } }      ~      } 以下略

投稿2021/02/24 13:11

kureid

総合スコア3

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問