SwiftUI - TabBar 按钮更改

Posted

技术标签:

【中文标题】SwiftUI - TabBar 按钮更改【英文标题】:SwiftUI - TabBar Button Change 【发布时间】:2021-02-12 19:39:59 【问题描述】:

您好,我正在学习 SwiftUI,但在尝试构建应用程序时遇到了问题。我的问题是如何制作一个标签栏,在活动时更改systemImage(当主页按钮处于活动状态时,它显示“home.fill”,当用户按下搜索按钮时,主页按钮变为“主页” )。

如果您看到我可以在下面的代码中做出任何改进,我们也很感激。谢谢,祝您有美好的一天,并保持安全。

import SwiftUI

struct ContentView: View 
    
    @State private var fullScreenCover = false
    
    init() 
        UITabBar.appearance().isTranslucent = false
    
    
    var body: some View 
        
        VStack 
            ForEach(0..<6)  num in
                Spacer()
            
            
            HStack 
                Spacer()
                Button(action: , label: 
                    Image(systemName: "message")
                    .font(.system(size: 20))
                )
                .padding(.horizontal, 15)
            
            .foregroundColor(Color("Reverse"))
            .padding(.vertical, 8)
            
            TabView 
                Main_Home()
                .tabItem 
                    Image(systemName: "house")
                    .font(.system(size: 30))
                
                
                Main_Search()
                .tabItem 
                    Image(systemName: "magnifyingglass")
                    .font(.system(size: 30))
                
                
                Main_AddContent()
                .tabItem 
                    Image(systemName: "plus.viewfinder")
                    .font(.system(size: 30))
                
                
                Main_Message()
                .tabItem 
                    Image(systemName: "pencil.circle.fill")
                    .font(.system(size: 30))
                
                
                Main_Profile()
                .tabItem 
                    Image(systemName: "person.crop.circle")
                    .font(.system(size: 30))
                
            
            .accentColor(Color("Reverse"))
            
        
        .background(Color("Normal"))
        .edgesIgnoringSafeArea(.all)
    

【问题讨论】:

【参考方案1】:

这是一个自定义ViewModifier,可用于添加标签项:

public struct TabViewItem<SelectionValue>: ViewModifier where SelectionValue: Hashable 
    @Binding private var selectedIndex: SelectionValue
    private let index: SelectionValue
    private let text: String
    private let imageName: String

    public init(selectedIndex: Binding<SelectionValue>, index: SelectionValue, text: String, imageName: String) 
        self._selectedIndex = selectedIndex
        self.index = index
        self.text = text
        self.imageName = imageName
    

    public func body(content: Content) -> some View 
        content
            .tabItem 
                image
                Text(text)
            
            .tag(index)
    

    private var image: some View 
        guard selectedIndex == index else 
            return Image(systemName: imageName)
        
        let imageName = self.imageName + ".fill"
        if let uiImage = UIImage(systemName: imageName) 
            return Image(uiImage: uiImage)
        
        return Image(systemName: self.imageName)
    

public extension View 
    func tabItem<Selection>(
        _ text: String,
        imageName: String,
        index: Selection,
        selection: Binding<Selection>
    ) -> some View where Selection: Hashable 
        modifier(TabViewItem(selectedIndex: selection, index: index, text: text, imageName: imageName))
    

那么,创建TabView 就更简单了:

struct ContentView: View 
    @State private var selectedTab = 3

    var body: some View 
        TabView(selection: $selectedTab) 
            Text("Main_Home")
                .tabItem("Home", imageName: "house", index: 1, selection: $selectedTab)
            Text("Main_Search")
                .tabItem("Search", imageName: "magnifyingglass", index: 2, selection: $selectedTab)
            Text("Main_AddContent")
                .tabItem("AddContent", imageName: "plus.viewfinder", index: 3, selection: $selectedTab)
            Text("Main_Message")
                .tabItem("Message", imageName: "pencil.circle", index: 4, selection: $selectedTab)
            Text("Main_Profile")
                .tabItem("Profile", imageName: "person.crop.circle", index: 5, selection: $selectedTab)
        
    

注意:上述实现是出于通用目的 - 如果您不需要某些部分(例如标签中的 text),只需将其删除或使其成为可选。

【讨论】:

以上是关于SwiftUI - TabBar 按钮更改的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI 没有使用 List 和 TabView 正确处理 @State

如何使用子视图控制器中的按钮单击更改 tabBar 项目标题

TabBar 徽章事件和更改

在运行时更改 TabBar 中的选项卡

更改布尔值时无法在 SwiftUI 中更改按钮文本

使用 SwiftUI 设置 TabBar 项徽章计数