繁体   English   中英

SwiftUI 仅列出点击内容

[英]SwiftUI List only taps content

我在 SwiftUI 中有一个列表,我用自定义 SwiftUI 单元格填充,问题是在点击时我需要做一些事情,并且点击仅在您点击单元格中的文本时才有效,如果您点击任何空白区域,它不会工作。 我怎样才能解决这个问题?

struct SelectDraftView: View {
    @Environment(\.presentationMode) var presentationMode

    @ObservedObject var viewModel = SelectDraftViewModel()
    
    var body: some View {
        VStack {
                List {
                    ForEach(viewModel.drafts.indices, id: \.self) { index in
                        DraftPostCell(draft: viewModel.drafts[index])
                            .contentShape(Rectangle())
                            .onTapGesture {
                                presentationMode.wrappedValue.dismiss()
                            }
                    }
                    .onDelete { indexSet in
                        guard let delete = indexSet.map({ viewModel.drafts[$0] }).first else { return }
                        viewModel.delete(draft: delete)
                    }
                
            }
                .background(Color.white)
            Spacer()

        }
    }
}

struct DraftPostCell: View {
    var draft: CDDraftPost
    
    var body: some View {

        VStack(alignment: .leading) {
            Text(draft.title ?? "")
                .frame(alignment: .leading)
                .font(Font(UIFont.uStadium.helvetica(ofSize: 14)))
                .padding(.bottom, 10)
            if let body = draft.body {
                Text(body)
                    .frame(alignment: .leading)
                    .multilineTextAlignment(.leading)
                    .frame(maxHeight: 40)
                    .font(Font(UIFont.uStadium.helvetica(ofSize: 14)))
            }
            Text(draft.date?.toString(format: "EEEE, MMM d, yyyy") ?? "")
                .frame(alignment: .leading)
                .font(Font(UIFont.uStadium.helvetica(ofSize: 12)))
        }
        .padding(.horizontal, 16)
    }
}

尝试在DraftPostCell(...)之后添加.frame(idealWidth: .infinity, maxWidth: .infinity) ) 。 如果需要,您还可以使用minWidth:

EDIT-1:我用于测试的代码(在真实设备上 ios 15.6,macCatalyst,不是预览版):

import Foundation
import SwiftUI


struct ContentView: View {
    var body: some View {
        SelectDraftView()
    }
}

class SelectDraftViewModel: ObservableObject {
    @Published var drafts: [
        CDDraftPost] = [
            CDDraftPost(title: "item 1", date: Date(), body: "body 1"),
            CDDraftPost(title: "item 2", date: Date(), body: "body 4"),
            CDDraftPost(title: "item 3", date: Date(), body: "body 3")]
    
    func delete(draft: CDDraftPost) {  }
}

struct CDDraftPost: Codable {
    var title: String?
    var date: Date?
    var body: String?
}

struct SelectDraftView: View {
    @Environment(\.presentationMode) var presentationMode
    
    @ObservedObject var viewModel = SelectDraftViewModel()
    
    var body: some View {
        VStack {
            List {
                ForEach(viewModel.drafts.indices, id: \.self) { index in
                    DraftPostCell(draft: viewModel.drafts[index])
                        .frame(idealWidth: .infinity, maxWidth: .infinity, alignment: .leading)
                        .contentShape(Rectangle())
                        .border(.red)  // <-- for testing
                        .onTapGesture {
                            print("----> onTapGesture")
                            //  presentationMode.wrappedValue.dismiss()
                        }
                }
                .onDelete { indexSet in
                    guard let delete = indexSet.map({ viewModel.drafts[$0] }).first else { return }
                    viewModel.delete(draft: delete)
                }
            }
            .background(Color.white)
            Spacer()
            
        }
    }
}

struct DraftPostCell: View {
    var draft: CDDraftPost
    
    var body: some View {
        VStack(alignment: .leading) {
            Text(draft.title ?? "")
                .frame(alignment: .leading)
            //    .font(Font(UIFont.uStadium.helvetica(ofSize: 14)))
                .padding(.bottom, 10)
            if let body = draft.body {
                Text(body)
                    .frame(alignment: .leading)
                    .multilineTextAlignment(.leading)
                    .frame(maxHeight: 40)
                //   .font(Font(UIFont.uStadium.helvetica(ofSize: 14)))
            }
            Text(draft.date?.formatted() ?? "")
                .frame(alignment: .leading)
            //  .font(Font(UIFont.uStadium.helvetica(ofSize: 12)))
        }
        .padding(.horizontal, 16)
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM