情况是:
我希望在我的表加载数据时禁用uitableview单元格的单击操作。
所以在加载期间,我使用了:
self.tableview.allowsSelection = NO;
或
self.tableview.userInteractionEnabled = NO;
禁用操作。
但我终于发现我只想禁用cellviews的交互,但启用了headerview的交互。
有没有方便的方法呢?
非常感谢。
加法:
我的细胞已经在屏幕上了。我将从服务器获取一些新数据。所以旧的细胞已经过时了。这就是我想禁用它们的原因。
我的问题的更多代码:
对于tableview的标题视图,它包含一个segmentControl:
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
UIView *headerView = [[UIView alloc]init];
headerView addSubview:self.segmentControl;
...
return headerView;
}
对于segmentControl的Action,它有forControlEvents:UIControlEventValueChanged
的操作:
[_segmentedControl addTarget:self action:@selector(segmentValueChanged) forControlEvents:UIControlEventValueChanged];
当值改变时:
-(void)segmentValueChanged{
//tag 1
[self.somedata loadFromServer];
}
loadFromServer是一个异步方法,意味着我们不需要等待它,我们现在可以做其他事情。当这个方法完成后,它将调用委托的函数:mentionDataLoadFinished
-(void)mentionDataLoadFinished{
//tag 2
[self.tableview reloadData];
}
我想在标记1到标记2期间禁用所有单元格交互,但我仍然希望我的标题视图正常工作。
答案 0 :(得分:0)
在'cellForRowAtIndexPath'中,你可以设置cell.userInteractionEnabled = NO,这应该可以解决问题。
- EDIT-- 在你的.h文件loadStarted和loadingInProgress中制作2个布尔值,默认情况下这些布尔值设置为'NO'
现在,当您向webApp发出请求后,您可以将这些布尔值设置为“是”
loadStarted = YES;
loadingInProgress = YES;
中的
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)path {
//Check if those 2 booleans are equal to YES
if(loadStarted && loadingInProgress){
cell.userInteractionEnabled = NO;
}else{
cell.userInteractionEnabled = YES;
}
上面的代码将确保在加载完成后禁用您的单元格。 现在,您必须确保重新加载tableview两次,一次是在您发出请求时,另一次是在您收到回复时。
此外,当您从服务器接收数据时,您会将两个布尔值设置为“否”,这应该照顾它
希望这会有所帮助
答案 1 :(得分:0)
您可以使用单个静态变量创建UITableViewCell
的子类,以一次更改所有单元格的状态。但是,无论当前视图控制器的状态如何,这都会影响整个应用程序中的所有单元格。例如,如果屏幕上有两个表使用相同的单元子类,则在第一个UITableView
完成加载后,将启用所有单元格。
@interface MyTableViewCell : UITableViewCell
+ (void)allowInteraction:(BOOL)allow;
@end
@implementation MyTableViewCell
static BOOL __allowInteraction = NO;
+ (void)allowInteraction:(BOOL)allow {
__allowInteraction = allow;
}
- (BOOL)userInteractionEnabled {
return __allowInteraction;
}
@end
修改:子类UITableViewCell
将为您完成此操作,或者您可以设置一个标记并调用reloadData
。它只会重新加载屏幕上的单元格,因此速度很快。
- (void)refreshFromServer {
disableCells = YES;
[self.tableView reloadData];
[self anAsynchronousProcessWithACompletionHandler:^{
disableCells = NO;
[self.tableView reloadData];
}];
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)path {
// ..
cell.userInteractionEnabled = !disableCells;
return cell;
}