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

Posted

技术标签:

【中文标题】在 Swift 中的视图控制器之间传递自定义类数据【英文标题】:Pass custom class data between view controllers in Swift 【发布时间】:2015-05-01 17:58:08 【问题描述】:

我有两个视图控制器,一个包含一个 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!

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

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

我在网上搜索了两天,又看了其他帖子,没有结果!

【问题讨论】:

邮政编码来自ItemDetailViewController。它可能在初始化后的某个地方设置了自己的值。最有可能的罪魁祸首是viewWillAppear:viewDidAppear: 同意。可能在某个时候有一种方法会覆盖它,可能是在其中一个出现的方法中。我看不出您处理错误实例的原因。 这里有错字吗?您的ItemDetailViewController 上的参数称为thisItem,但在您上面的代码中,您将myTableViewItem 传递给称为itsItem 的东西 有一个错字,但那只是因为我将名称通用放到网上。但它与 thisItem 相同的参数是我在编写 newController.itsItem 时所指的 .. 在第二个控制器中使用的项目 【参考方案1】:

根据下面的 cmets 更改答案

如果我理解正确,

将属性设为可选

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.
  

【讨论】:

我确定问题出在我尝试做的时候:newController.itsItem = myTableViewItem as Item 虽然我指的是它的Item,它已被声明为:var thisItem:Item!它在类的 init 方法中创建一个新对象和初始化参数是填充对象中的每个变量而不是复制以前的变量。问题是我不知道如何解决这个问题,因为类中的每个参数都需要在初始化方法中明确定义 如果我理解正确.. 那么我会 1) 将其更改为可选的 ?最后(然后值以 nil 开始)在 initMethod 中设置如下 if thisItem! == nil thisItem = 你的默认值; (为了便于格式化,我添加了我的评论作为附加答案) 我宁愿使用didSet。那么只需要一个属性,不需要get【参考方案2】:

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

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

var: tester:string!

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

var test = itemViewItem.itemName
newController.tester = test

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

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

var itemTest: Item!

itemTest = itemViewItem

println(itemTest.itemName)
println(itemViewItem.itemName)

两者是等价的。然而,第二个视图控制器中的值第一次为“nil”。但是,如果我按下后退按钮,然后第二次/第三次/第四次返回视图控制器.. 从那时起,无论哪一行(项目)启动 segue,它都会按预期工作。让我相信它与传递信息和类实现有关。

【讨论】:

以上是关于在 Swift 中的视图控制器之间传递自定义类数据的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Swift 中的视图控制器之间传递数据?

在 Swift 中的页面视图控制器内的视图控制器之间传递数据

Swift:嵌入在导航控制器中的视图之间的自定义segue

如何在 Swift 中的视图之间传递数据

Swift - 从自定义单元格传递数据

在 Swift 中的 ONE ViewController 中的视图之间传递数据