使用SwiftUI List(),ForEach()、. onTapGesture WatchOS6传递值时出现问题

时间:2019-12-19 14:11:01

标签: swiftui xcode11 watchos-6

我正在尝试使用.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和编码通常还是很陌生,但我认为正确的方法是说已使用cell(view?)2,因此将2传递给方法func playerSkipTo(skipToIndex: Int),我试图对值进行硬编码2这样,它可以与硬编码值一起使用:

enter image description here

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

我尝试使用与使用IndexSet的.onDelete()方法相同的逻辑,如下所示: enter image description here

我最终要将值传递给的方法如下:

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等。

任何帮助或指针都将不胜感激!

Heres the playerSkipTo method:

        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")
        }
    }

2 个答案:

答案 0 :(得分:1)

代替跳转到索引,而是跳转到特定的跟踪对象:

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

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

List {
    Section(header: Text("Songs")) {
        ForEach(model.trackPreviewList!, id: \.id) {
            Text($0.artistName + ": " + $0.name)
                .onTapGesture {
                    self.playerSkipTo($0)
                }
        }
    }
}

答案 1 :(得分:0)

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

zip()