在Swift中的视图控制器之间传递自定义类数据

时间:2015-05-01 17:58:09

标签: ios uitableview class swift viewcontroller

我有两个视图控制器,一个包含一个tableview,另一个包含显示以下选择特定行的页面。

在我的viewController开始时,我实例化了我的Class变量

var myTableViewItem = Item()

我从数据数组中获取了选定的行信息:

...

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
         myTableViewItem = pList[indexPath.row]
         println("\(itemViewItem.getItemName())")
        performSegueWithIdentifier("itemSelect", sender: myTableViewItem)
}



override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    if segue.identifier == "itemSelect" {
        let nController = segue.destinationViewController as UINavigationController
        let newController = nController.viewControllers[0] as ItemDetailViewController
        println("\(myTableViewItem.getItemValue())") //Statement correctly prints item parameter.
        newController.itsItem = myTableViewItem as Item
    }
}

并在目标视图控制器(newController)中有一个带有可选类引用的参数

var thisItem: Item!

但是每当我尝试访问后续视图控制器中的任何类数据时,它只会保存默认的初始化值。而不是从发送对象传递的那些

发送对象肯定是完全填充了非默认值(通过控制台打印语句验证)。当我尝试分配数据时,我无法弄清楚为什么会发生这种情况。

我在网上搜索了两天看其他帖子但现在无济于事!

2 个答案:

答案 0 :(得分:0)

根据以下评论更改了答案

如果我理解正确,

使该属性成为可选

var  thisItem: Item?

然后在viewDidLoad方法中检查它是否为nil来设置默认值,如果你之前设置它,它可能会有一个值:

func viewDidLoad() {
if thisItem! == nil{
 thisItem = theDefaultValue
}

...

旧答案: 如果您无法确定值的更改位置,我会添加一个带有断点的setter / getter

var _thisItem: Item?
var  thisItem: Item? {
  get {
    return _thisItem;
  }

  set {
    _thisItem = newValue;
    println("value was changed to \(newValue)");//add a breakpoint here and check trace.
  }
}

答案 1 :(得分:0)

感谢您的投入。我已将问题缩小到类初始化问题。

我修改了代码以在第二个视图控制器中包含一个可选变量:

var: tester:string!

并在第一个VC中添加了一行:

var test = itemViewItem.itemName
newController.tester = test

当第二个视图控制器加载时,我能够从viewDidLoad()将名称打印到控制台。因此问题是当我的自定义类在新VC中被赋值时。由于某种原因,它无法取得给定值。

奇怪的是,如果我在第一个控制器中包含了我在第二个控制器中使用的相同对象初始化器:

var itemTest: Item!

itemTest = itemViewItem

println(itemTest.itemName)
println(itemViewItem.itemName)
这两个是等价的。但是,第二个视图控制器中的值第一次为'nil'。然而,如果我按下后退按钮,然后返回到视图控制器第二个/第三个/第四个...次,它将按照预期工作,随后任何行(项目)启动segue。引导我相信它与传递信息和类实现有关。