状態変化を監視する変数は body View の上で宣言する
body内で宣言すると状態変化しない(状態変化する時にViewを表示し直すため)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
struct test: View { @State var aaa = 0 //OK var body: some View { @State var bbb = 0 //NG Button(action: { aaa += 1 bbb += 1 }) { Text("\(String(aaa))") } Text("\(String(bbb)") } } |
id: \.self
ForEachでコレクションを一つずつ取り出して処理する時にviewのidに第一引数と同じものを与える?
このForEachの\.selfで動的に複数のListViewを作った場合挙動がおかしくなる。その場合はUUIDで構成したIDを割り当てる。
参考記事: https://zenn.dev/kntk/articles/1f1b40da6fe181
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
let aaa: [String] = ["a", "b", "c"] ForEach(aaa, id: \.self){ bbb in Text("\(bbb)") } //テキストが a b c で作成されると同時にtextのidもa b cに振られる? //動的にList等のViewを作成する時は下のようなUUID構造体でIDに割り振らないと動作がおかしくなる struct aaa: Identifiable{ var id = UUID() //変数名は id のみ有効 var bbb: String } struct ContentView: View{ @State var ccc: [aaa] = [aaa(bbb: "あああ"), aaa(bbb: "いいい"), bbb(ccc: "ううう")] var body: some View { List{ ForEach (ccc) { a in Button(action: { }){ Text(a.bbb) } } } } } |
viewのカスタマイズは三項演算子で行う
SwiftUIのif文はオブジェクトを一度インスタンス化してから分けるのでその分処理が無駄になる
プロトコルとは
C++とかの抽象クラス的な機能
Listの背景色modifierについて
List内の背景色はすこし特殊で本体部と個別Viewを設置する【行】の背景色とで別れていて記述も通常と少し違う
文字色は通常通りの設定で可能
1 2 3 4 5 6 |
List { Text("あああ") .listRowBackground(Color.blue) //Textの行の背景色 } .scrollContentBackground(.hidden) //一度本体部を透明にする .background(Color.gray) //透明にしてから色を設定する |

コメント