如何使用SwiftUI移除列表上的突出显示?

时间:2019-06-11 13:57:52

标签: ios swiftui

如何使用SwiftUI移除列表上的突出显示?

List {

}.whatModifierToAddHere?

selection manager documentation对此没说什么。

8 个答案:

答案 0 :(得分:6)

我知道我来晚了,但这是针对那些正在搜寻的人(例如我?)

我发现了什么

我想您应该看看How to disable the overlay color for images inside Button and NavigationLink中的短文@TwoStraws

只需将.buttonStyle(PlainButtonStyle())修饰符添加到List中的项目中,您将拥有所需的内容。这也使ButtonList中重新工作,这是我遇到的另一个问题。

Swift 5.1 的工作示例:

import Combine
import SwiftUI

struct YourItem: Identifiable {
    let id = UUID()
    let text: String
}

class YourDataSource: ObservableObject {
    let willChange = PassthroughSubject<Void, Never>()
    var items = [YourItem]()

    init() {
        items = [
            YourItem(text: "Some text"),
            YourItem(text: "Some other text")
        ]
    }
}

struct YourItemView: View {
    var item: YourItem

    var body: some View {
        VStack(alignment: .leading) {
            Text(item.text)
            HStack {
                Button(action: {
                    print("Like")
                }) {
                    Image(systemName: "heart.fill")
                }
                Button(action: {
                    print("Star")
                }) {
                    Image(systemName: "star.fill")
                }
            }
        }
        .buttonStyle(PlainButtonStyle())
    }
}

struct YourListView: View {
    @ObservedObject var dataSource = YourDataSource()

    var body: some View {
        List(dataSource.items) { item in
            YourItemView(item: item)
        }
        .navigationBarTitle("List example", displayMode: .inline)
        .edgesIgnoringSafeArea(.bottom)
    }
}

#if DEBUG
struct YourListView_Previews: PreviewProvider {
    static var previews: some View {
        YourListView()
    }
}
#endif

如文章所述,它也适用于NavigationLink s。希望对您有所帮助??

答案 1 :(得分:4)

您问题的简单答案。点击时您不想突出显示的任何单元格都只需添加此修饰符

.buttonStyle(PlainButtonStyle())

因此,修饰符不是针对整个列表,而是针对内部的每个单元格

var body: some View{
    List{
        ForEach(self.getElementsForList()){ element in
            ElementCell(element: element)
                .buttonStyle(PlainButtonStyle())
        }
    }
}

答案 2 :(得分:2)

我知道我来晚了,但是希望这能解决您的问题。 您需要使用UIKit修饰符将其删除。我建议您将它们放在SceneDelegate.swift上。

class SceneDelegate: UIResponder, UIWindowSceneDelegate {

    var window: UIWindow?


    func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
        // Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`.
        // If using a storyboard, the `window` property will automatically be initialized and attached to the scene.
        // This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead).

        // Create the SwiftUI view that provides the window contents.
        let contentView = TabController()

        // Use a UIHostingController as window root view controller.
        if let windowScene = scene as? UIWindowScene {

            //MARK: Disable selection.
            UITableView.appearance().allowsSelection = false
            UITableViewCell.appearance().selectionStyle = .none

            let window = UIWindow(windowScene: windowScene)
            window.rootViewController = UIHostingController(rootView: contentView)
            self.window = window
            window.makeKeyAndVisible()

        }
    }
}

编辑:这将禁用应用程序中的所有表格视图选择。相反,如果要禁用特定表视图上的选择,则可以在init()内禁用它。

struct SomeViewWithTableView: View {

    init() {
        //MARK: Disable selection.
        UITableView.appearance().allowsSelection = false
        UITableViewCell.appearance().selectionStyle = .none
    }

    var body: some View {
        //your view code here
    }
}

答案 3 :(得分:1)

仅向列表中的项目添加.buttonStyle(PlainButtonStyle())修饰符,不幸的是不适用于我的情况。 相反,通过使用List上的.onAppear()修饰符和UITableViewCell的Appearance API,我能够获得所需的效果-在点击一行时看不到任何突出显示效果。

如以下示例所示:

List {
    ForEach(items) { item in
        NavigationLink(destination: DetailView(item)) {
            RowView(item)
        }
    }
}
.onAppear {

    // this will disable highlighting the cell when is selected
    UITableViewCell.appearance().selectionStyle = .none

    // you can also remove the row separators
    UITableView.appearance().separatorStyle = .none

}

答案 4 :(得分:1)

编辑:

以下内容仅在SwiftUI视图嵌入在UIKit父级中时有效。



对于仍然想知道的人,可以使用.onAppear修饰符来实现。

.onAppear {
            UITableViewCell.appearance().selectionStyle = .none
    }

这类似于UIKit中的viewWillAppear。 来源:HackingWithSwift

答案 5 :(得分:1)

可能的解决方案是使用 ZStack 。并将插图调整为.zero。将 Color.red 更改为您的颜色。 您的列表:

ForEach(items) { item in
    ZStack {
        NavigationLink(destination: DetailView()) {
            EmptyView()
        }
        ItemRowWrap(item: item)
            .background(Color.red)
    }
    
}
.listStyle(InsetListStyle())
.listRowInsets(EdgeInsets(top: 0, leading: 0, bottom: 0, trailing: 0))

您的ItemRowView:

struct ItemRowWrap: View {
    
    let item: ListItem
    
    var body: some View {
        ItemRow(item: item)
            .padding(EdgeInsets(top: 5, leading: 8, bottom: 5, trailing: 8))
    }
    
}

您可以根据需要调整填充。

答案 6 :(得分:1)

我遇到了同样的问题,我认为这是一个错误。

如果我在列表顶部放置一个文本,导航链接项将被突出显示;

如果我删除它或将其放在列表下方,导航链接项将不会突出显示。

VStack {
    Text("Some word") // Remove it or put it below List
    List {
        NavigationLink(destination: RedirectionFromList(data: data.first!)) {
            Text("test")
        }
    }
    
}

如果将文本放在列表的顶部,我找不到关闭突出显示的方法,非常恼火。

答案 7 :(得分:0)

AccentColor 中设置全局 Assets.xcassets,如下所述

enter image description here