Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/44.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在iPhone中从儿童视图在objective-c中设置ivar_Iphone_Objective C_Memory Management - Fatal编程技术网

在iPhone中从儿童视图在objective-c中设置ivar

在iPhone中从儿童视图在objective-c中设置ivar,iphone,objective-c,memory-management,Iphone,Objective C,Memory Management,也许是这个网站上的常见问题 我有一个保存表单的TableViewController。在这种形式下,我在它自己的单元格中有两个字段:一个用于选择谁支付了单个选择,另一个用于选择为多个选择支付费用的人员 这两个字段都将打开UINavigationController中包含的新TableViewController “付款人”的单个选择字段保留对象成员资格 多选字段付费保存一个对象NSMutableArray 两个VAR以相同的方式发送到新控制器: mySingleSelectController.

也许是这个网站上的常见问题

我有一个保存表单的TableViewController。在这种形式下,我在它自己的单元格中有两个字段:一个用于选择谁支付了单个选择,另一个用于选择为多个选择支付费用的人员

这两个字段都将打开UINavigationController中包含的新TableViewController

“付款人”的单个选择字段保留对象成员资格 多选字段付费保存一个对象NSMutableArray

两个VAR以相同的方式发送到新控制器:

mySingleSelectController.crSelectedMember = self.crPaidByMember;
myMultipleSelectController.crSelectedMembers = self.crSelectedMembers;
在付费控制器中,我使用didSelectAtIndexPath方法设置付费成员的可变数组:

 if ([[tableView cellForRowAtIndexPath:indexPath] accessoryType] == UITableViewCellAccessoryCheckmark) {
  [self.crSelectedMembers removeObject:[self.crGroupMembers objectAtIndex:indexPath.row]];
  //...
 }
 else {
  [self.crSelectedMembers addObject:[self.crGroupMembers objectAtIndex:indexPath.row]];
  //...
 }
到目前为止一切进展顺利。从子视图中可以完美地设置可变数组CRSELECTEDEMBERS。 但是 我无法设置成员身份对象

我使用DidSelectatinIndexPath在“付费控制器”中设置成员资格:

[self setCrSelectedMember:[crGroupMembers objectAtIndex:indexPath.row]];
通过NSlogging crSelectedMember,我在self中获得了正确的所选成员,但在ivar指向的父视图中,没有任何更改


我做错什么了吗?因为我可以调用crSelectedMembers的方法,但我不能更改crSelectedMember的值。

如果我理解您的问题,最可能的原因是不正确的属性声明

如果要使用每个对象特性将值从一个对象传递到另一个对象,则需要确保使用“指定”来确保一个对象中的特性与另一个对象中的特性指向相同的实例

因此,在topViewController中,您有一个属性:

@property (nonatomic,retain) NSString crSelectedMember;
然后在子视图控制器中,您有:

@property (nonatomic,assign) NSString crSelectedMember;
这将强制将值放入父控制器中的确切对象中

但是,这是在ViewController之间传递数据的一种非常脆弱的方法。随着应用程序变得越来越复杂,将不可能跟踪所有传递的数据。更糟糕的是,如果遇到内存限制,当您尝试向父视图控制器传递数据时,它可能会卸载,甚至不存在

相反,您应该有一个专用于保存数据的自定义对象。每个视图控制器都应查询该对象以获取其所需的数据,并应将任何更改写回该对象。视图控制器从不直接通信。这种技术允许您将数据控制在一个特定的位置,而不是将其分散在代码中,并且可以很好地扩展。您可以向应用程序添加任意数量的视图控制器,而无需担心将它们捆绑在一起


有关详细信息,请参阅此帖子:

谢谢!我认为链接帖子中提到的单例方法会奏效。