【问题标题】:Unable to pass indexpath.row integer to 2nd view controller无法将 indexpath.row 整数传递给第二个视图控制器
【发布时间】:2016-10-30 00:53:11
【问题描述】:

请看下面的 segue 代码。有两个控制器。第一个控制器是一个表视图,它有一个变量“activeRow”,它是一个整数,用于标识选定的 indexPath 行。然后通过 segue 将变量“activeRow”传递给第二个视图控制器,该控制器具有显示所选 indexPath 行的标签。没什么复杂的。当我运行代码时,无论索引路径如何,第二个视图控制器上的标签始终显示“0”。 “0”是变量“activeRow”的初始值。但是,我在代码中插入的打印函数(见下文)显示“activeRow”的值根据 tableview 的选定 indexPath 行而变化。注意:当我运行模拟器时,控制台会打印“segue function:”两次。例如,如果 indexPath 值为 1,则将以下内容打印到控制台:“segue function: 0”和“segue function: 1”

无论如何,“activeRow”的值不会通过 segue 传递。

但是,如果我从 secondViewController.labelTxt 中删除“activeRow”变量并简单地给它一个字符串值:secondViewController.labelTxt =“Test”,那么字符串“Test”将传递给第二个视图控制器并通过标签显示.

有什么想法吗?

示例代码:

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

    activeRow = indexPath.row

    print("This is the active row selected: \(indexPath.row)")

    performSegue(withIdentifier:"sendToDetailView", sender: nil)
}


override func prepare(for segue: UIStoryboardSegue, sender: Any?) {

    if segue.identifier == "sendToDetailView" {

    let secondViewController = segue.destination as! DetailViewController

    secondViewController.labelTxt = String(activeRow)

    print("segue function: \(secondViewController.labelTxt)")

}

第二视图控制器代码

import UIKit

class DetailViewController: UIViewController {

    var labelTxt = ""

    //var activeRow = 0

    @IBOutlet var testLable: UILabel!


    override func viewDidLoad() {
        super.viewDidLoad()

       testLable.text = labelTxt

        // Do any additional setup after loading the view.
    }

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

【问题讨论】:

  • 我认为 UILabel 还没有被实例化。在 let secondViewController = 之后放一个断点,然后检查 labelTxt 变量。很确定它为零,因此无法设置文本。将其设置为第二个 VC 中的另一个变量,然后将其分配给从该变量加载的视图。
  • 您在第二个视图控制器的哪个位置将labelText 放入标签中?请出示该代码
  • 确保您没有直接从情节提要中的表格视图单元格链接segue。单元格的“操作”连接器应为空白
  • 尝试在第一个视图控制器中初始化 var labelTxt。希望对你有帮助
  • Paulw11- 当您写下单元格的“操作”连接器应该为空白时,您是什么意思。目前,segue 从表格单元格链接到第二个视图。这是一个“推”动作。我这样做是因为触发 segue 的事件是点击 tableview 单元格。

标签: ios iphone swift segue


【解决方案1】:

将indexPath 作为转场发送者传递,以便在转场准备中将其传递给DetailViewController。当控制器传递indexPath 时,将执行didSet 块。

出口尚未在prepare(for segue: 中加载,因此通过在 switch 语句中使用目标视图,我们会自动解开值并加载视图。

MasterViewController.swift

// MARK: UITableViewDelegate

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

    performSegue(withIdentifier:"sendToDetailView", sender: indexPath)
}

// MARK: Navigation

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {

    switch (segue.destination.view, segue.destination, sender) {
    case let (_, controller as DetailViewController, indexPath as NSIndexPath):
        controller.indexPath = indexPath
        break
    default:
        break
    }
}

DetailViewController

// MARK: Outlets

@IBOutlet var testLabel: UILabel?

// MARK: Properties

var indexPath: NSIndexPath? {
    didSet {
        testLabel?.text = indexPath?.row.description
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-07
    • 1970-01-01
    • 2012-10-26
    相关资源
    最近更新 更多