7

SwiftUI のフォームでピッカーを作成しています。ピッカーで新しい要素を選択すると、ビューがフォームに戻ったときに、ピッカーの行が選択解除されません。これが私が意味することのスクリーンショットです。ピッカー行はこのようにグレー表示されたままです。ここに画像の説明を入力

これは Xcode 11.3 のバグであるという以前の回答を読みましたが、Xcode 12 ベータ 4 を実行していて、これがまだバグであるかどうかはわかりません。

これは私がピッカーを作成する方法です:

struct SettingsView: View {
    @State private var currentSelection = 1
    var body: some View {
        NavigationView {
            Form {
                Section {
                    Picker("Test 2", selection: $currentSelection) {
                        ForEach(1 ...< 100) { i in
                            Text(String(i)).tag(i)
                        }
                    }
                }
            }
        }
    }
}

これが私のContentViewで、そこからSettingsViewを提示しています:

enum ActiveSheet: Identifiable {
    case photoPicker, settings
    
    var id: Int {
        self.hashValue
    }
}

struct ContentView: View {
 
    @State var activeSheet: ActiveSheet?
    var body: some View {
        
        NavigationView {
            VStack {
                Text("Hello world")
                Button("Select Photo") {
                    self.activeSheet = .photoPicker
                }
            }
            .navigationBarTitle(Text("Title"), displayMode: .inline)
            .navigationBarItems(trailing: Button(action: {
                self.activeSheet = .settings
            }, label: {
                Image(systemName: "gear")
                    .imageScale(.large)
            }))
        }
        .sheet(item: $activeSheet) { item in
            if item == .photoPicker {
                ImagePicker(selectedImage: $image, sourceType: .photoLibrary)
            } else {
                SettingsView()
            }
        }
    }
}

編集:私は真新しいプロジェクトを作成しました.これは唯一のコードです:

import SwiftUI

struct ContentView: View {
    @State private var currentSelection = 0
    var body: some View {
        NavigationView {
            Form {
                Section {
                    Picker("Test Picker", selection: $currentSelection) {
                        ForEach(0 ..< 100) { i in
                            Text(String(i)).tag(i)
                        }
                    }
                }

            }.navigationBarTitle(Text("Test"))
        }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

問題はまだ解決していません。

4

1 に答える 1

4

(記録として、私は Big Sur、Xcode 12.2 を使用していますが、この問題はまだ残っています。)

いくつかのテストの後、この動作は同じビュー内の複数のリストが原因であることがわかりました。ナビゲーション スタックがポップされてビューに戻されると、最初の「リスト」(つまり UITableView) の選択された行が選択解除されることがわかりますが、これは最初のリストの後のリストでは機能しません。明らかにこれはバグです (SwiftUI ?!)。

このバグを回避するために私が見つけた唯一の方法 (そしてなんとなくくだらない方法) は、Introspect Libraryに目的の tableView (この場合はフォームを表示するもの) を取得させ、次のようなハウスキーピングを行うことです。


import Introspect

...

public class Weak<T: AnyObject> {
   public weak var value: T?
   public init(_ value: T? = nil) {
     self.value = value
   }
}

private var listTableView = Weak<UITableView>()

var body: Some View {
   NavigationView {
      VStack {
        
        List {
          ...
        }
        
        Form {
          
          Picker(...) {
            ...
          }
        }
        .introspectTableView { listTableView.value = $0 }
        .onAppear() {
          
          if let tableView = listTableView.value, let indexPath = tableView.indexPathForSelectedRow {
             tableView.deselectRow(at: indexPath, animated: true)
          }

        }
}

それは動作します...しかし、アニメーションはありません(誰か?)。

于 2020-12-14T10:31:07.973 に答える