如何禁用所有tableviewcells'互动,但启用标题视图' uitableview中的互动?

时间:2014-11-12 18:24:17

标签: ios uitableview

情况是:

我希望在我的表加载数据时禁用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期间禁用所有单元格交互,但我仍然希望我的标题视图正常工作。

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;
}