web-dev-qa-db-ja.com

SwiftUIの更新ナビゲーションバーのタイトルの色

SwiftUIでナビゲーションバーのタイトルの色を変更する方法

_NavigationView {
            List{
                ForEach(0..<15) { item in
                    HStack {
                        Text("Apple")
                            .font(.headline)
                            .fontWeight(.medium)
                            .color(.orange)
                            .lineLimit(1)
                            .multilineTextAlignment(.center)
                            .padding(.leading)
                            .frame(width: 125, height: nil)


                        Text("Apple Infinite Loop. Address: One Infinite Loop Cupertino, CA 95014 (408) 606-5775 ")
                            .font(.subheadline)
                            .fontWeight(.regular)
                            .multilineTextAlignment(.leading)
                            .lineLimit(nil)


                    }
                }
            }
            .navigationBarTitle(Text("TEST")).navigationBarHidden(false).foregroundColor(.orange)
            }
_

私は.foregroundColor(.orange)で試しましたが、機能しません

.navigationBarTitle(Text("TEST").color(.orange))も試しました

何か助け?

28

13.4の更新

注:これを翌日に再確認すると、私の標準の設定がやや標準的でないことが原因で問題が発生した可能性があります。私はまだモハベを実行していますが、手動で13.4サポートファイルを追加しました(通常はxcode 11.4経由でのみ利用可能) 、これはカタリナを必要とします)タブバーのカスタムカラーの問題もあるため、これに言及しましたが、電話が実際に接続されており、xcodeからアプリを実行している場合にのみ、これらの問題が発生していることに気づきました。プラグを抜いて、通常どおりアプリを実行します。タブバーの問題が表示されないので、ナビゲーションバーの問題に類似性がある可能性があります...

(これを上記のarseniusの回答(現在受け入れられている回答)のコメントとして追加しますが、担当者がいないので...)

私はそのソリューションを使用していましたが、13.4まで完全に機能していましたが、少なくとも私にとってはそれが壊れているようです。多くのビュー階層トレースの後、回避策で説明したように、渡されたUIViewControllerを介して暗黙のUINavigationControllerに簡単にアクセスできなくなるように変更されたようです。それはまだそこにあります(かなりツリーのはるか上)、それを見つける必要があります。

そのためには、navbarが見つかるまでビューの階層をたどって、通常どおり、その上に目的のパラメーターを設定します。これには、新しい検出機能と、NavigationConfigurator構造体へのいくつかのマイナーな変更とそのインスタンス化が必要です...

まず、発見機能:

func find_navbar(_ root: UIView?) -> UINavigationBar?
{
    guard root != nil else { return nil }

    var navbar: UINavigationBar? = nil
    for v in root!.subviews
    {   if type(of: v) == UINavigationBar.self { navbar = (v as! UINavigationBar); break }
        else { navbar = find_navbar(v); if navbar != nil { break } }
    }

    return navbar
}

navigationConfiguratorを次のように変更します(ビューの受け渡しは信頼性がなくなったため、もう必要ありません)。

struct NavigationConfigurator: UIViewControllerRepresentable
{
    @EnvironmentObject var prefs: Prefs     // to pick up colorscheme changes

    var configure: () -> Void = {}
    func makeUIViewController(context: UIViewControllerRepresentableContext<NavigationConfigurator>) -> UIViewController { UIViewController() }
    func updateUIViewController(_ uiViewController: UIViewController, context: UIViewControllerRepresentableContext<NavigationConfigurator>) { self.configure() }
}

(私のアプリでは、色などを追跡するPrefsオブジェクトがあります)

...次に、インスタンス化サイトで、次のようにします。

MyView()
    .navigationBarTitle("List", displayMode: .inline)
    .navigationBarItems(trailing: navbuttons)
    .background(NavigationConfigurator {
        if self.prefs.UI_COLORSCHEME != Colorscheme.system.rawValue
        {   if let navbar = find_navbar(root_vc?.view)
            {   navbar.barTintColor = Colors.uicolor(.navbar, .background)
                navbar.backgroundColor = .black
                navbar.titleTextAttributes = [.foregroundColor: Colors.uicolor(.navbar, .foreground)]
                navbar.tintColor = Colors.uicolor(.navbar, .foreground)
            }
        }
    })

ルートビューコントローラーをアプリの他の場所にキャプチャし、それをここでfind_navbar()に渡すことに注意してください。あなたはそれを別の方法で実行したいかもしれませんが、他の理由でその変数はすでに周りにあります...たとえば、色に関連するオブジェクトなど、私のアプリに固有のいくつかの他のものがありますが、あなたはそのアイデアを理解します。

0
rnr-a-np