也许在这个网站上有一个常见问题。
我有一个保存表单的TableViewController。在表单中,我有两个字段(每个字段都在自己单元格中):一个字段用于选择谁支付了费用(单选),另一个字段用于选择支付了费用的人员(多选)。
这两个字段都会打开一个包含在UINavigationController中的新TableViewController。
单选字段(付款人)保存一个对象成员身份多个选择字段(付钱)保存一个对象NSMutableArray
这两个变量以相同的方式发送到新的控制器:
mySingleSelectController.crSelectedMember = self.crPaidByMember;
myMultipleSelectController.crSelectedMembers = self.crSelectedMembers;
在Paid控制器中,我使用didSelectAtIndexPath方法设置一个可变的成员资格数组,这些成员资格是为谁付费的:
if ([[tableView cellForRowAtIndexPath:indexPath] accessoryType] == UITableViewCellAccessoryCheckmark) {
[self.crSelectedMembers removeObject:[self.crGroupMembers objectAtIndex:indexPath.row]];
//...
}
else {
[self.crSelectedMembers addObject:[self.crGroupMembers objectAtIndex:indexPath.row]];
//...
}
到目前为止,一切都很顺利。可变数组(crSelectedMembers)是从子视图中完美设置的。但是..。我在设置成员资格对象时遇到问题。
通过控制器付费,我使用didSelectAtIndexPath来设置成员资格:
[self setCrSelectedMember:[crGroupMembers objectAtIndex:indexPath.row]];
通过NSlogging crSelectedMember,我在self中获得了正确选择的成员,但在ivar指向的父视图中,没有任何更改。
我做错了什么吗?因为我可以调用crSelectedMembers的方法,但不能更改crSelectedMember的值。
发布于 2010-03-31 12:41:01
如果我理解你的问题,最有可能的原因是不正确的属性声明。
如果要使用每个对象的属性将值从一个对象传递到另一个对象,则需要确保使用assign
来确保一个对象中的属性与另一个对象中的属性指向相同的实例。
所以在你的topViewController中你有一个属性:
@property (nonatomic,retain) NSString crSelectedMember;
然后在你的子视图控制器中,你有:
@property (nonatomic,assign) NSString crSelectedMember;
这会强制将值放入父控制器中的确切对象中。
然而,这是在viewControllers之间传递数据的一种非常脆弱的方式。随着您的应用程序变得越来越复杂,跟踪所有传递的数据将是不可能的。(更糟糕的是,如果遇到内存限制,当您尝试向父视图控制器传递数据时,它可能会卸载甚至不存在。)
相反,您应该有一个专门用于保存数据的自定义对象。每个视图控制器都应该查询该对象以获取它需要的数据,并且应该将任何更改写回该对象。视图控制器从不直接通信。这种技术允许您在一个特定的位置控制数据,而不是将其分散到代码中,并且它具有很好的伸缩性。您可以将任意数量的视图控制器添加到您的应用程序中,而不必担心将它们全部捆绑在一起。
有关详细信息,请参阅本文:iPhone: How to Pass Data Between Several Viewcontrollers in a Tabbar App
https://stackoverflow.com/questions/2551699
复制