11

iOS 14 でしか利用できないが、アプリが iOS 13 で利用できる場合、ビュー修飾子をビューに追加するにはどうすればよいですか?

たとえば、textCase(_). iOS 14 のセクション ヘッダーは大文字であるため、ヘッダー テキストの大文字と小文字を使用するには、で設定する必要があり.textCase(.none)ますTextが、これは iOS 14 まで存在しませんでした。

Section(header:
    Text("Header")
        .textCase(.none) //FIXME: 'textCase' is only available in iOS 14.0 or newer
        .font(.system(size: 14, weight: .bold))
        .foregroundColor(.secondary)
        .padding(.top, 50)
)

Xcode にはいくつかの提案があります。

  • #利用可能なバージョンチェックの場合に追加
  • @available 属性を追加

#available バージョン チェックを使用すると、その範囲指定されたすべてのコードが #available でラップされるため、コードを 1 行追加するには、そのすべてを複製する必要があります。@available を使用する場合は、body プロパティ全体または構造体全体を複製する必要があります。

iOS 14 の場合にのみ適用される独自の ViewModifier を作成することを検討しましたが、この恐ろしいエラーが発生します。

関数は不透明な戻り値の型を宣言していますが、その本体の return ステートメントには一致する基になる型がありません

struct CompatibleTextCaseModifier: ViewModifier {
    func body(content: Content) -> some View {
        if #available(iOS 14.0, *) {
            return content
                .textCase(.none)
        } else {
            return content
        }
    }
}
4

1 に答える 1

10

bodyとしてマーク@ViewBuilder- これにより、内部のさまざまな戻り値の型を自動的に追跡しreturn、明示的な戻り値がビュー ビルダー ラッパーを無効にするため、削除できます。

ここに固定バリアントがあります

struct CompatibleTextCaseModifier: ViewModifier {

    @ViewBuilder
    func body(content: Content) -> some View {
        if #available(iOS 14.0, *) {
            content
                .textCase(.none)
        } else {
            content
        }
    }
}

と使い方

Section(header:
    Text("Header")
        .modifier(CompatibleTextCaseModifier())
        .font(.system(size: 14, weight: .bold))
        .foregroundColor(.secondary)
        .padding(.top, 50)
) {
    Text("test")
}
于 2020-07-24T16:27:38.030 に答える