【问题标题】:How to pass a different url to the next VC with prepare for segue?如何将不同的 url 传递给准备 segue 的下一个 VC?
【发布时间】:2019-10-25 19:20:26
【问题描述】:

我想将不同的 url 传递给下一个 VC,与用户通过我的准备 segue 选择的单元格相比,但我该怎么做?谢谢!

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

    let idGenderMovie = gendersDataModel[indexPath.row].id
    let urlString = "https://api.themoviedb.org/3/discover/movie?api_key=&with_genres=\(idGenderMovie)"
    performSegue(withIdentifier: "showMovies", sender: self)
}

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    guard let showMovieFilteredVC = segue.destination as? ShowFilteredMovie else {return}
    showMovieFilteredVC.urlGender = //???
}

【问题讨论】:

  • 好吧,问题在于您拥有该信息,因为选择了有问题的行。但随后您致电tableView.deselectRow 将信息丢弃。你为什么这么做?基本上你是说你需要知道它是哪一行,然后故意向自己隐藏它是哪一行!这很愚蠢。
  • 你也说parseMovieGender(json: data),但是那个调用的result会发生什么?我没有看到你用你对性别的新知识任何事情。去哪儿了?
  • 好吧,我现在明白了,我编辑了我的代码,但我仍然不知道如何根据用户选择的行将我的 url 传递给另一个 VC

标签: ios swift xcode segue


【解决方案1】:

正如马特在他的评论中所说,您知道在您的 didSelectRowAt() 方法中选择了哪个单元格。您使用用户选择的行从数据模型中提取 URL,从该 URL 获取一些数据,然后将该信息放在地板上。

相反,在您的视图控制器中创建一个实例变量 userSelectedRow,并在您的 didSelectRowAt() 方法中设置它。然后,在您的 prepareForSegue 中,使用选定的行来获取您需要的信息并将其传递给您的目标视图控制器。

编辑:

或者,正如马特建议的那样,不要保存任何东西。保留选中的行,然后在 prepare(for:) 中查询您的表格视图以获取其选定的行,并使用它来获取您的数据。

顺便说一句,如果 URL 指向远程服务器,您应该使用Data(contentsOf:) 读取它。这是一个同步调用,它将阻塞您的用户界面,直到它完成。尝试使用该调用从远程服务器读取数据时,您可能会导致 UI 冻结长达 2 分钟。 (这会导致您的应用因无响应而被终止。)

【讨论】:

  • 我真的不能同意这一点。您应该保存选定的行。该行被选中!如果你不把事情搞砸,它仍然会在prepare(forSegue:)中被选中,你可以直接问表是哪一行,然后从那里开始。
  • @matt "该行已被选中。"很公平。但是,有时您希望在用户点击该行后取消选择该行,并让它像一个按钮一样工作。我想这就是我阅读 OPs 代码时的想法。
  • 我还是不能同意。如果要取消选择该行,请在 之后 prepare(forSegue:) 进行操作,而不是之前。实际上通常的做法是在viewWillAppear 中进行;这就是 UITableViewController 所做的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-11
  • 1970-01-01
  • 2020-05-23
  • 2016-09-28
  • 1970-01-01
相关资源
最近更新 更多