【问题标题】:Setting ivar in objective-c from child view in the iPhone在 iPhone 的子视图中在 Objective-C 中设置 ivar
【发布时间】:2010-03-31 09:19:13
【问题描述】:

可能是本网站的常见问题解答。

我有一个包含表单的 TableViewController。在该表单中,我有两个字段(每个字段都在其自己的单元格中):一个用于选择支付者(单选),另一个用于选择支付人员费用(多选)。

这两个字段都会打开一个包含在 UINavigationController 中的新 TableViewController。

单选字段(Paid By)持有一个对象Membership 多选字段(付费)持有一个对象NSMutableArray

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

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]];
  //...
 }

到目前为止一切顺利。可变数组 (crSelectedMembers) 是从子视图完美设置的。 但... 我在设置 Membership 对象时遇到问题。

从付费控制器我使用 didSelectAtIndexPath 来设置成员身份:

[self setCrSelectedMember:[crGroupMembers objectAtIndex:indexPath.row]];

通过 NSlogging crSelectedMember,我在 self 中获得了正确的选定成员,但在 ivar 指向的父视图中,没有任何改变。

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

【问题讨论】:

    标签: iphone objective-c memory-management


    【解决方案1】:

    如果我理解您的问题,最可能的原因是财产申报不当。

    如果您想使用每个对象的属性将值从一个对象传递到另一个对象,那么您需要确保使用assign 来确保一个对象中的属性指向与另一个对象中的属性相同的实例.

    所以在你的 topViewController 中你有一个属性:

    @property (nonatomic,retain) NSString crSelectedMember;
    

    然后在您的子视图控制器中,您有:

    @property (nonatomic,assign) NSString crSelectedMember;
    

    这会将值强制到父控制器中的确切对象中。

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

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

    详情见此贴:iPhone: How to Pass Data Between Several Viewcontrollers in a Tabbar App

    【讨论】:

    • 谢谢!我认为链接帖子中提到的单例方法可以解决问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-14
    • 2012-03-14
    • 1970-01-01
    相关资源
    最近更新 更多