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

Ios 在Swift中的视图控制器之间传递自定义类数据,ios,uitableview,class,swift,viewcontroller,Ios,Uitableview,Class,Swift,Viewcontroller,我有两个视图控制器,一个包含tableview,另一个包含显示以下特定行选择的页面 在viewController的开头,我实例化了类变量 var myTableViewItem = Item() 我已从数据数组中获取所选行信息: 并且在目标视图控制器(newController)中有一个参数,带有可选的类引用 var thisItem: Item! 然而,每当我试图访问后续视图控制器中的任何类数据时,它只保存默认的初始化器值。而不是从发送对象传递的 发送对象肯定完全填充了非默认值(通过控

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

在viewController的开头,我实例化了类变量

var myTableViewItem = Item()
我已从数据数组中获取所选行信息:

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

var thisItem: Item!
然而,每当我试图访问后续视图控制器中的任何类数据时,它只保存默认的初始化器值。而不是从发送对象传递的

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


我在网上搜索了两天,看了其他的帖子都没有用

根据以下评论更改了答案:

如果我理解正确的话

将属性设置为可选属性

var  thisItem: Item?
然后,在viewDidLoad方法中,检查设置默认值是否为零,如果您之前设置了默认值,则此处可能会有一个值:

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.
  }
}

谢谢你的意见。我已经把问题缩小到了类初始化的问题上

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

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”。但是,如果我按下“后退”按钮,然后返回视图控制器,则返回第二个/第三个/第四个。。从那时起,无论哪一行(项目)启动序列,它都将按预期工作。让我相信这与传递信息和类实现有关。

ItemDetailViewController
发布代码。它可能在初始化后的某个地方设置自己的值。最可能的罪魁祸首是
视图将出现:
视图显示:
同意。可能有一个方法在某个点上覆盖了它,可能是在其中一个方法中。我看不出你处理错误实例的原因。这里有打字错误吗?
itemtailviewcontroller
上的参数称为
thisItem
,但在上面的代码中,您将
myTableViewItem
传递给一个名为
itsItem
的对象,其中有一个输入错误,但这只是因为我将这些名称设置为通用名称以供联机使用。但它与我在编写newController.itsItem时所指的参数thisItem相同。。第二个控制器中使用的项我确定问题是在尝试执行以下操作时:newController.itsItem=myTableViewItem作为项,尽管我指的是已声明为:var thisItem:item的itsItem!它在类的init方法中创建一个新对象和initialiser参数是填充对象中的每个变量,而不是复制以前的变量。问题是,我不知道如何绕过它,因为如果我理解正确,类中的每个参数都需要在initialiser方法中显式定义。。然后我会1)将其更改为可选,并带有?在initMethod的末尾(该值随后开始为nil),如果thisItem!==nil{thisItem=您的默认值;}(为了便于格式化,我添加了注释作为附加答案),我宁愿使用
didSet
。然后只需要一个属性,不需要
get
var itemTest: Item!

itemTest = itemViewItem

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