答案 0 :(得分:6)
我想您应该看看How to disable the overlay color for images inside Button and NavigationLink中的短文@TwoStraws
只需将.buttonStyle(PlainButtonStyle())
修饰符添加到List
中的项目中,您将拥有所需的内容。这也使Button
在List
中重新工作,这是我遇到的另一个问题。
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)