我正在尝试使用.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这样,它可以与硬编码值一起使用:
尽管在如何传递某种标识符方面我一无所知,但我认为我的问题是我试图访问方法“知道它”的范围之外的对象。
我尝试使用$ 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等。
任何帮助或指针都将不胜感激!
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")
}
}
答案 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()