【问题标题】:How to pass selected row string in table view to another ViewController page? (Swift 2)如何将表格视图中选定的行字符串传递到另一个 ViewController 页面? (斯威夫特 2)
【发布时间】:2016-03-27 21:39:25
【问题描述】:

我正在运行 Xcode 7.3 并使用 Swift 2.2。我无法将数据从我的第一个视图控制器传递到第二个视图控制器。我在我的第一个视图控制器中创建了一个变量string,它保存了表格视图中的选定行并且它可以工作。我还在我的第二个视图控制器中创建了另一个变量string,它应该保存所选行的名称,然后将文本传递给标签。

import UIKit
import Parse
import ParseUI

class FruitListPage: UIViewController, UITableViewDelegate, UITableViewDataSource {


var selectedFruit = String()

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {

    let fruitName:Scanner2 = self.storyboard?.instantiateViewControllerWithIdentifier("scanPage") as! Scanner2
    fruitName.loadView()
    let nameShop = textArray[indexPath.row]
    print(nameShop)
    selectedFruit = nameShop

    print(selectedFruit)

    fruitName.selectedFruit2 = selectedFruit

}

在第一个视图控制器中,一切都运行良好,每次在表格视图中按一行时,我都可以看到水果名称。真正的问题是第二个视图控制器中的selectedFruit2 字符串永远不会从第一个视图控制器中获取数据。有什么线索吗?

import UIKit
import Parse

class Scanner2: UIViewController {

@IBOutlet var fruitNameLabel: UILabel!

var selectedFruit2 = String()

override func viewDidLoad() {
    super.viewDidLoad()

    print(selectedFruit2)

}

}

【问题讨论】:

  • loadView 文档:“你永远不应该直接调用这个方法”。另请注意,您在加载视图之后设置selectedFruit2。删除loadView 可能会解决您的问题,尽管viewWillAppear(_:) 可能比viewDidLoad 更安全

标签: ios storyboard swift2


【解决方案1】:

您可以尝试创建一个全局变量并在override func prepareForSegue 方法中使用tableView.indexPathForSelectedRow!.row 对其进行初始化。我就是这样做的,效果很好。

【讨论】:

    【解决方案2】:

    例如,将 storyBoard 中的 viewController 与 segue 连接,并将其标识符设置为“scanPageSegue”...然后:

    func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
        performSegueWithIdentifier("scanPageSegue", sender: textArray[indexPath.row])
    }
    
    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        if segue.identifier == "scanPageSegue" {
            if let fruitName = segue.destinationViewController as? Scanner2, 
               selectedFruit = sender as? String {
                fruitName.selectedFruit2 = selectedFruit
            }
        }
    }
    

    【讨论】:

    • 感谢它非常有用且简单...我之前尝试过 prepareforsegue 功能,但对我来说真正重要的部分是将情节提要与 segue 连接并使用标识符执行 egue,然后执行 prepareforsegue。我被困在这个问题上将近 3 天了。这是 swift 2 中的新功能吗?
    • 不是真的,这是在storyBoard中使用的基本机制,在swift之前也是一样的:D无论如何......现在你知道了。基本上,您永远不需要使用故事板以编程方式实例化 VC,而是使用 segue,您还可以使用自定义子类来使用自定义转换进行 segue。
    【解决方案3】:

    试试这个,在你的 tableView:didSelectedRowAtIndexPath:

    func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
        let fruitName:Scanner2 = self.storyboard?.instantiateViewControllerWithIdentifier("scanPage") as! Scanner2
        selectedFruit = textArray[indexPath.row]
        fruitName.selectedFruit2 = selectedFruit
        self.presentViewController(fruitName,animated:true,completion:nil)
    }
    

    【讨论】:

      【解决方案4】:

      你可以试试这个:

      override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
      if let indexPath = self.tableView.indexPathForSelectedRow {
      let destinationVC = segue.destinationController
      destinationVC.string = textArray[indexPath] //this is the string in second view controller
      }
      }
      

      【讨论】:

        猜你喜欢
        • 2017-03-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-03-01
        • 1970-01-01
        • 2017-07-22
        • 2015-08-03
        相关资源
        最近更新 更多