我猜你应该看一下这篇简短文章:如何禁用按钮和导航链接中图像的叠加颜色,作者是@TwoStraws
只需在List
中的项目上添加.buttonStyle(PlainButtonStyle())
修改器,就可以得到想要的效果。这还可以使List
中的Button
再次正常工作,这也是我遇到的另一个问题。
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
。我希望它能帮助你们中的一些人
简单回答您的问题。任何不希望在点击时突出显示的单元格,只需添加此修改器。
.buttonStyle(PlainButtonStyle())
因此,这个修饰符并不是针对整个列表的,而是针对每个单元格。var body: some View{
List{
ForEach(self.getElementsForList()){ element in
ElementCell(element: element)
.buttonStyle(PlainButtonStyle())
}
}
}
listRowBackground
即可消除选定的灰色背景。 - Lluis Gerard#if os(iOS)
.listRowBackground(Color.white)
#elseif os(macOS)
.listRowBackground(Color.clear)
#endif
- Daniel Walton我知道我来晚了,但希望这可以解决你的问题。
您需要使用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
}
}
UITableViewCell.appearance().selectionStyle = .none
这个就够了。 - Cinn这需要根据iOS的不同采用不同的方法。
iOS 14:
.onAppear {
UITableViewCell.appearance().selectionStyle = .none
}
对于iOS 15:
List {
ListItem()
.listRowBackground(Color.clear)
}
只是在List中的项目上添加.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
}
如果我理解正确,您希望通过单击/轻拍来选择项目,并在再次单击时取消选择。
struct SimpleSelectionView: View {
@State var items = ["First", "Second", "Third"]
@State var selectedItem: String?
var body: some View{
List{
ForEach(items, id: \.self) { item in
Text(item)
.onTapGesture {
if selectedItem == nil || selectedItem != item {
selectedItem = item
} else {
selectedItem = nil
}
}
.listRowBackground(self.selectedItem == item ? Color(red: 0.275, green: 0.420, blue: 0.153, opacity: 0.3) : .white)
}
}
}
}
缺点是在 macOS 上,您必须点击内容(文本)而不是行本身,但这是一个不错的轻量级解决方案,如果您想对所选内容进行操作,则可以在 didSet 中完成。
我遇到了同样的问题,我认为这是一个bug。
如果我在列表上方放置一个文本,导航链接项将会被突出显示;
如果我删除它或将其放置在列表下方,则导航链接项将不会被突出显示。
VStack {
Text("Some word") // Remove it or put it below List
List {
NavigationLink(destination: RedirectionFromList(data: data.first!)) {
Text("test")
}
}
}
.onDisappear {
UITableViewCell.appearance().isSelected = false
}
当界面消失或出现时,您可以将选定设置为 false。
.buttonStyle(PlainButtonStyle())
“解决方案”并不起作用。它只是减少了高亮效果,无论是在滚动还是普通按钮点击时。 - Martin