从 uitableview 隐藏或删除部分
Posted
技术标签:
【中文标题】从 uitableview 隐藏或删除部分【英文标题】:Hide or remove section from uitableview 【发布时间】:2011-06-27 07:20:32 【问题描述】:我在我的应用程序中实现了一个分组表视图,用户可以从表的不同部分选择行。
我想根据第一部分的行选择隐藏(删除)特定部分(包括标题)。
即
第一部分的标题是“你有车吗?”,在行选择中答案是“是”或“否”。 如果用户选择否,则分组表中的第二和第三部分应隐藏(删除)。
对于分组表中的单选,我实现this
我也参考了this,但没有完全满足我的需求。
请帮忙。
编辑
TableViewDelegates
myArray 是我的数据源。 myArrayAnswerCount 包含每个部分的行数计数
-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
return [myArray count];
-(NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
for (int i = 0; i<[myArray count]; i++)
if (section==i)
return [[myArray objectAtIndex:i] title];
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
for (int i = 0; i<[myArray count]; i++)
if (section==i)
return [[myArrayAnswerCount objectAtIndex:i] intValue];
这是我如何从表中删除部分的代码, myIndexPath 是 NSIndexPath 变量,它指向当前选择的部分。
[table beginUpdates];
[myArray removeObjectAtIndex:myIndexPath.section];
[table deleteSections:[NSIndexSet indexSetWithIndex:myIndexPath.section] withRowAnimation:YES];
[table endUpdates];
【问题讨论】:
看这里:developer.apple.com/library/ios/#documentation/userexperience/… 【参考方案1】:我解决了我的问题。
[table beginUpdates];
[myArray removeObjectAtIndex:myIndexPath.section];
[table deleteSections:[NSIndexSet indexSetWithIndex:myIndexPath.section] withRowAnimation:UITableViewRowAnimationRight];
[table endUpdates];
“第 0 节中的行数无效。更新后现有节中包含的行数 (2) 必须等于更新前该节中包含的行数 (3)”错误我是否也忘记从 myArrayAnswerCount 数组中删除对象了。
所以最后是下面的代码
[table beginUpdates];
[myArray removeObjectAtIndex:myIndexPath.section];
[myArrayAnswerCount removeObjectAtIndex:myIndexPath.section]; //this is what i forgot.
[table deleteSections:[NSIndexSet indexSetWithIndex:myIndexPath.section] withRowAnimation:UITableViewRowAnimationRight];
[table endUpdates];
谢谢。
【讨论】:
myArrayAnswerCount 是 [myArray count] 的值还是其他值。如果我给出 [[myArray Count] removeObjectAtIndex:],它会抛出警告“method removeObjectAtIndex”未找到,请帮助我,在此先感谢:) @Eshwar Chaitanya:myArrayAnswerCount 包含表中每个部分的行数。很明显是一个可变数组。 我每个部分只有 1 行,当我在添加提醒页面中添加提醒时,部分的数量会有所不同,请相应地建议我,提前谢谢:) 我的意思是当我按编辑时,我可以按 - 号并删除单元格,但是当我再次导航并进入我们执行编辑和删除操作的视图时,删除的单元格仍然可用,如何使部分永久删除,谢谢:) @EshwarChaitanya:myArrayAnswerCount 只是一个可变数组,其中包含表中每个部分的行数(这将是一个 int 计数,在您的情况下,每个部分的值可能为 1)。包括您还需要从数据源中删除值(您可能为此使用了可变数组)。首先检查一下。也相应地调试您的代码。【参考方案2】:您可以查看您的UITableViewDataSource
,例如:
- (NSInteger)numberOfSectionsInTableView:(UITableView *)aTableView
if(YOUR_INSTANCE_BOOL_VAR==NO)
return 1;
else
return 3;
用户选择 NO 后,将 YOUR_INSTANCE_BOOL_VAR 设置为 NO,然后调用 [tableView reloadData]
;
显然,您还必须操纵numberOfRowsInSection
以在用户选择NO 后触发您想要的行数。
另一种方式是拨打:- (void)deleteSections:(NSIndexSet *)sections withRowAnimation:(UITableViewRowAnimation)animation;
您可以通过以下方式获取行 indexPaths:
+ (NSIndexPath *)indexPathForRow:(NSUInteger)row inSection:(NSUInteger)section;
【讨论】:
@Mat :嗨,我选择使用 - (void)deleteSections:(NSIndexSet *)sections withRowAnimation:(UITableViewRowAnimation)animation;方法,现在如何在从组中成功删除特定部分后更新我的数据(我的意思是 NSMutableArray),这些数据加载到分组表中? 我不知道你的 NSMutableArray 中有什么类型的对象以及按什么顺序,但是使用 NSMutableArray 你可以通过访问索引来添加/删除/替换任何对象。 @Mat :嗨,我收到一些错误“第 0 节中的行数无效。更新 (2) 后现有节中包含的行数必须等于包含的行数在更新之前的那个部分(3)”,同时删除第 0 部分。在删除部分时,第 1 部分必须具有与第 0 部分相同的行数吗? 这是一个经典问题,可能是因为在修改dataSource之前调用了reloadData,但是如果你编辑你的问题并发布你的tableviewdelegate和tableviewdatasource回调,也许我们可以更好地理解问题出在哪里。跨度> @Mat:嗨,我解决了问题,实际上我忘记从 myArrayAnswerCount 中删除对象。这就是为什么它向我显示这样的错误。谢谢你的帮助..【参考方案3】:如果您不想实际删除部分或行,而只是将其隐藏。您可以使用:
[tableView beginUpdates];
[tableView reloadSections:[NSindexSet indexSetWithIndex:(indexOfSection)] withRowAnimation:(UITableViewRowAnimationOfChoice)]; //hide section
或
[tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:(UITableViewRowAnimationOfChoice)]; //hide rows
[tableView endUpdates];
如果您阅读文档,它会说这些行为类似于删除/插入方法,但是它们实际上并未被删除,因此无需删除/插入。您可以调用该方法两种隐藏或取消隐藏。
【讨论】:
以上是关于从 uitableview 隐藏或删除部分的主要内容,如果未能解决你的问题,请参考以下文章