将 indexpath 行传回父视图

Posted

技术标签:

【中文标题】将 indexpath 行传回父视图【英文标题】:Passing back indexpath row to parent view 【发布时间】:2012-01-31 16:42:34 【问题描述】:

我有两个 UITableview。第一个显示 3 个部分,每个部分 3 行,这是默认布局。当用户按下第 2 行第 0 部分时,将显示第二个视图以选择一个值。一旦选择了值,它就会返回到第一个视图,但这一次,布局不同。根据选择的值,第一个视图只能显示一个、两个或三个部分。我试图实现这种行为,将索引路径从子视图传递到其父视图并动态更改节数。我得到在子视图中选择的行数,但是一旦它被传递给父视图,行数就变为零。

子视图的代码是:

    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
          [tableView deselectRowAtIndexPath:indexPath animated:YES];
          NSUInteger row = indexPath.row;
          //Create parent view instance to pass back indexpath as a integer
          DiarioA *plc = [[DiarioA alloc] init];
          NSInteger i1 = row; 
          plc.rowTipo = i1;
          [plc release];
          [self.navigationController popViewControllerAnimated:YES];

Pa

ret view (DiarioA.h)

@property (nonatomic, assign) int rowTipo;

父视图 (Diario.m)

@synthesize rowTipo;

- (void)viewWillAppear:(BOOL)animated
       [self.tableView reloadData];
       //Check if rowTipo has value
       NSLog(@"RowTipo: %d",rowTipo);
  

//Use rowTipo to dynamically adjust uitableview layout.
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
      if (self.rowTipo==0) 
          return 3;
      
      return self.rowTipo;
   

您能否帮助我确定为什么我会丢失从子视图到父视图的索引路径。非常感谢您的帮助。

【问题讨论】:

【参考方案1】:

DiarioA *plc = [[DiarioA alloc] init]; 您在此处创建一个新对象并设置 plc.rowTipo = i1; 会更改此对象的值而不是父对象。 要么将父对象传递给子控制器,然后像这样更改其值。

// child .h file

DiarioA *plc;
@property (nonatomic, assign) DiarioA *plc;

//child .m file
@synthesize plc;

// code when you push your child controller
ChildController *controller = [[ChildController allo] initWithNibName.....];
controller.plc = self

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
          [tableView deselectRowAtIndexPath:indexPath animated:YES];
          NSUInteger row = indexPath.row;
          plc.rowTipo = row;
          [self.navigationController popViewControllerAnimated:YES];

【讨论】:

Inder,谢谢。现在,它工作得很好。你更喜欢这个而不是代表吗?或者两者都有效地相等。顺便说一句,我不能投票,因为我的观点,但是,你的回答对我帮助很大.. 如果你不投票那就不好了 :( 无论如何.. 它与 delgates 相同.. 在这里我们只是传递了一个对象并调用了与 delgates 相同的 setter 方法......只需更改您的 .h 文件变量进入 id delegate; 并在其上调用 setter [delegate setRowTipo:row]; 然后它看起来像委托,尽管两者是相同的.. 现在很清楚,你可以接受它并支持它;) 非常感谢您的宝贵时间。我至少需要 15 分才能投票,但是,您的答案已被完全接受,这正是我要寻找的。投票+2【参考方案2】:

我认为你应该为你的子视图控制器制定协议,并让你的父视图控制器成为它的代表。不仅仅是在你的子视图控制器初始化之后设置委托属性,然后调用你的委托方法发送索引路径。

【讨论】:

罗曼,谢谢。是否有其他替代方法代替委托方法?据我了解,我正在尝试简化代码。 @Memo Roman 的建议确实是这种情况下唯一合适的解决方案。它简化您的代码。 有很多解决方案,例如发布通知或 Inder 的方法。这次很简单。但是下次你可能会遇到一个属性设置不够的情况。 罗曼,谢谢你的建议。我会的,一旦我获得更多的专业知识。我是使用 iphone 开发的财务人员,我与代表的关系不是很成功;对我来说很复杂。所以,一步一步来。感谢您的反馈。

以上是关于将 indexpath 行传回父视图的主要内容,如果未能解决你的问题,请参考以下文章

如何将 indexPath 数组拆分为单独的 indexPath 数组,每个数组的 indexPath 具有相同的 indexPath.section

将触摸事件传回父级

IndexPath.row 对于静态单元格不是唯一的

JSONArray 无法根据 indexPath 获取数组

在 IBAction 中获取 indexPath.row?

didSelectRowAt 索引的 indexPath 错误