【问题标题】:passing tapped cell data to another view via segue in Swift通过 Swift 中的 segue 将点击的单元格数据传递到另一个视图
【发布时间】:2018-08-26 19:46:09
【问题描述】:

我有一个 tableView,我正在尝试通过 segue 将与点击的单元格相关的数据发送到另一个视图。 我的代码仅在第二次点击后才有效,并且在第一次点击时总是返回 nil。我想由于某种原因 prepareForSegue 首先被执行,这就是为什么 detailToSend 在第一次点击时总是为零,而第二次点击我从前一个点击的单元格中获取数据。我怎样才能解决这个问题 ? 更新:

var detailToSend = SingleRepository()

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    if filteredResult.count > 0 {
        detailToSend = filteredResult[indexPath.row]
    } else {
        detailToSend = finalArrayUnwrapped[indexPath.row]
    }
    performSegue(withIdentifier: "showDetailSegue", sender: nil)
}


override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "showDetailSegue" {
        let vc = segue.destination as! DetailViewController
        vc.detail = detailToSend
    }
}

我的 DetailViewController

class DetailViewController: UIViewController {


@IBOutlet weak var detailLabel: UILabel!

var detail: SingleRepository?

override func viewDidLoad() {
    super.viewDidLoad()

    if let detailUnwrapped = detail {
        print(detailUnwrapped)
    }

}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

}

【问题讨论】:

  • 确保你的 segue 来自视图控制器对象,而不是单元格本身。您还可以通过在performSegue 调用中将详细信息指定为sender 来避免使用detailToSend 属性。
  • @Paulw11 我现在看到了问题,我是从单元格而不是视图对象中分离出来的。问题已解决,但我不知道如何获取 detailToSend,您能详细说明一下吗?

标签: ios swift


【解决方案1】:

确保您已经从情节提要中的视图控制器对象而不是单元格中创建了转场;如果您从单元格创建 segue,则 segue 将在调用 didSelectRowAt 之前触发。

正确设置segue后,可以使用sender参数来避免detailToSend属性的使用:

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

    var detailToSend: SingleRepository
    if filteredResult.count > 0 {
        detailToSend = filteredResult[indexPath.row]
    } else {
        detailToSend = finalArrayUnwrapped[indexPath.row]
    }
    performSegue(withIdentifier: "showDetailSegue", sender: detailToSend)
}


override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if let vc = segue.destination as? DetailViewController, let detailToSend = sender as? SingleRepository {            
        vc.detail = detailToSend
    }
}

【讨论】:

  • 我试过这个解决方案,第二次让你使用有错误,你用的是Swift 4吗?因为我得到“我在一个条件下获得变量绑定需要一个初始化程序。”第二次让错误。
  • 对不起。有一个错字。现已修复
  • 到目前为止,发布的三个解决方案都运行良好,但我相信这是最适合我使用的一个。
  • @Paulw11 就像 Ali 的场景一样,我有同样的情况,但不同的是,我有额外的表视图,其中包含来自详细 vc 的数据。所以我的层次结构,比如表格视图中的第一个视图数据和相同的数据传递到第二个视图的标签。最后,通过单击按钮将相同的数据作为表格视图传递给第三个 vc。我正在使用从第二个 vc 到第三个表视图的 segues。第二个 vc 是第一个带有导航的 vc 的子级。第三个 vc 是 tabbar 和 navigation vc 的子级。是否可以将多个表视图和单个视图作为 3 个视图?
【解决方案2】:

您可以在情节提要中设置手动转场并在点击时触发它。 所以不要从一个单元到控制器,而是从一个控制器到另一个控制器。

然后你的代码将是这样的:

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    if filteredResult.count > 0 {
        detailToSend = filteredResult[indexPath.row]
    } else {
        detailToSend = finalArrayUnwrapped[indexPath.row]
    }
    performSegue(withIdentifier: "showDetailSegue", sender: nil)
}

prepareForSegue 应该保持完全相同。

同时检查您的didSelectRowAt 方法。您忽略了范围内发生的所有事情

if filteredResult.count > 0 {
        detailToSend = filteredResult[indexPath.row]
}

因为之后你分配

detailToSend = finalArrayUnwrapped[indexPath.row]

【讨论】:

  • 我之前在故事板中设置了手动转场。我更新了 didSelectMethod。现在的问题是,在点击单元格后,您的代码会连续两次,并且和之前一样,第一次 segue 仍然为零,但第二次获取对象。
  • 你删除了之前的单元格segue吗?可能是你同时有两个 segues。
  • 好吧,如果我删除它,那么标识符也会被删除,因此无法执行Segue。
  • 如果您有手动转场,只需将其标识符设置为您想要的并删除单元转场
  • 是的,你删除了这个箭头。然后你 ctrl 从一个控制器(控制器顶部的黄色圆圈)拖动到另一个控制器 -> 选择 segue 类型(推),然后单击该箭头并设置一个标识符
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-03
  • 1970-01-01
  • 2012-09-04
  • 1970-01-01
  • 1970-01-01
  • 2020-03-03
相关资源
最近更新 更多