1

我正在尝试使用 .onTapGesture() 在点击视图上调用方法并传递某种 ID 或任何其他形式的标识符,但我不知道如何。

我有一个ListView从我的数组中获得的数据创建的视图trackPreviewList: [TrackpreviewList]

视图如下所示:

struct ListView: View {
    @ObservedObject var model: PlaybackService
    @State var list = PlaybackService.sharedInstance.trackPreviewList

var body: some View {
        List {
            Section(header: Text("Songs")) {
                ForEach(model.trackPreviewList!, id: \.id) {
                    Text($0.artistName + ": " + $0.name)
                 }
                    .onDelete(perform: deleteTrack)
                    .onTapGesture(perform: skipTo)
            }
        }
    }

我对 SwiftUI 和一般编码非常陌生,但我认为正确的方法是说单元格(视图?) 2 被点击,因此将 2 传递给func playerSkipTo(skipToIndex: Int)我尝试像这样对值 2 进行硬编码的方法,它适用于硬编码值:

在此处输入图像描述

虽然我对如何传递某种标识符一无所知,但我认为我的问题是我试图访问该方法“知道它”的范围之外的对象。我试图使用 $0.name 变量来查看我是否可以传递任何东西,但我得到了这个错误Contextual closure type '() -> Void' expects 0 arguments, but 1 was used in closure body,我认为这是因为 .onTapGesture() 方法没有闭包?

我尝试使用与使用 IndexSet 的 .onDelete() 方法相同的逻辑,如下所示: 在此处输入图像描述

最后我想将值传递给的方法如下所示:

func playerSkipTo(skipToIndex: Int) {
        if skipToIndex < ((trackPreviewList!.underestimatedCount)-1) {
            _ = firstly {
                TracklistProvider.sharedInstance.getPlaybackURL(trackPreview: trackPreviewList![skipToIndex])
            }.map { playbackoptions in
                self.createPlayerItemFromLink(assetURL: (playbackoptions?.playbackUrl)!)
            }.done{
                self.replacePlayerItem()
            }
        } else {
            print("The index \(skipToIndex) is out of bounds")
        }
    }

我知道我还需要更改playerSkipTo()采用 IndexSet 的方法,我也尝试过尝试将其转换为 Int 等。

非常感谢任何帮助或指示!

下面是 playerSkipTo 方法:

        if skipToIndex < ((trackPreviewList!.underestimatedCount)-1) {
            _ = firstly {
                TracklistProvider.sharedInstance.getPlaybackURL(trackPreview: trackPreviewList![skipToIndex])
            }.map { playbackoptions in
                self.createPlayerItemFromLink(assetURL: (playbackoptions?.playbackUrl)!)
            }.done{
                self.replacePlayerItem()
            }
        } else {
            print("The index \(skipToIndex) is out of bounds")
        }
    }
4

2 回答 2

1

不要跳到索引,而是跳到特定的轨道对象:

func playerSkipTo(_ playbackoptions: PlaybackOptions) {
   // ...
}

然后更改您的查看代码以在Text而不是调用此函数ForEach

List {
    Section(header: Text("Songs")) {
        ForEach(model.trackPreviewList!, id: \.id) {
            Text($0.artistName + ": " + $0.name)
                .onTapGesture {
                    self.playerSkipTo($0)
                }
        }
    }
}
于 2019-12-19T15:07:45.730 回答
0

您可以使用 ZStack 顶部的按钮:

        List{
            ForEach(appData.assets) { asset in
                ZStack {
                    HStack{
                        VStack(alignment: .leading) {
                            Text(asset.value)
                                .font(.headline)
                        }
                        Spacer()
                    }
                    Button(action: {assetPressed(id: asset.id)}, label: {
                        Text("")
                    })
                }
            }
            .onDelete(perform: deleteAsset)
        }
于 2021-05-03T19:24:15.570 回答