将 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