检测在tableview单元格外部点击以执行操作

时间:2014-06-18 19:12:02

标签: ios tableview

我是iOS开发的新手,我一直关注iOS的iOS介绍,并实施了待办事项列表应用程序。

我有tableview显示当前待办事项列表的列表,另一个视图控制器允许用户在文本字段中添加新项目然后添加到列表中。 我的tableview顶部有一个小+,它对添加的待办事项视图执行segue操作。

如果用户点击一个空单元格,我希望能够执行相同的操作 我尝试将此代码放入并且它可以工作,但我想把它放在正确的位置,这样它只会在用户点击表中的空白区域时触发:

[self performSegueWithIdentifier:@"showAddItem" sender:self];

谢谢。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { static NSString *cellIdentifier = @"ListPrototypeCell"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier forIndexPath:indexPath]; // Configure the cell... ABCTodoItem *toDoItem = [self.toDoItems objectAtIndex:indexPath.row]; cell.textLabel.text = toDoItem.itemName; if (toDoItem.completed) { cell.accessoryType = UITableViewCellAccessoryCheckmark; } else { cell.accessoryType = UITableViewCellAccessoryNone; } return cell; }

3 个答案:

答案 0 :(得分:0)

我可以在这里看到至少两种解决方案。

解决方案1.通过修改数据源添加空单元格

填写 toDoItems 后,请添加以下内容:

[self.toDoItems addObject:@""];

请注意 toDoItems 应该是NSMutableArray的类型。

现在让我们处理创建单元格:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *cellIdentifier = @"ListPrototypeCell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier forIndexPath:indexPath];

NSObject *objItem = [self.toDoItems objectAtIndex:indexPath.row];

if([objItem isKindOfClass: [ABCTodoItem class]]) {
     ABCTodoItem *toDoItem = (ABCTodoItem*) objItem;
     cell.textLabel.text = toDoItem.itemName;
}
else if([objItem isKindOfClass: [NSString class]]) {
     NSString *item = (NSString*) objItem;
     cell.textLabel.text = item;
}
return cell;
}

触摸操作:

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

   NSObject *objItem = [self.toDoItems objectAtIndex:indexPath.row];
   if([objItem isKindOfClass: [ABCTodoItem class]]) {
      ABCTodoItem *toDoItem = (ABCTodoItem*) objItem;
     // Open your toDoItem

   }
   else if([objItem isKindOfClass: [NSString class]]) {

       self performSegueWithIdentifier:@"showAddItem" sender:self];
   }

}

解决方案2.添加空单元格而不修改数据源

这样就可以创建一个额外的单元格:

- (NSInteger)numberOfRowsInSection:(NSInteger)section {
     return [self.toDoItems count] + 1;
}

现在再次让我们处理创建单元格:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
 static NSString *cellIdentifier = @"ListPrototypeCell";
 UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier forIndexPath:indexPath];

if([indexPath.row < [self.toDoItems count]) {
   NSObject *objItem = [self.toDoItems objectAtIndex:indexPath.row];

   if([objItem isKindOfClass: [ABCTodoItem class]]) {
      ABCTodoItem *toDoItem = (ABCTodoItem*) objItem;
      cell.textLabel.text = toDoItem.itemName;
   }
}
else {

      cell.textLabel.text = @"";
}
return cell;
}

然后处理触摸动作:

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

  if([indexPath.row < [self.toDoItems count]) {
     NSObject *objItem = [self.toDoItems objectAtIndex:indexPath.row];

     if([objItem isKindOfClass: [ABCTodoItem class]]) {
        ABCTodoItem *toDoItem = (ABCTodoItem*) objItem;
        // Open your toDoItem
     }
  }
  else {
     self performSegueWithIdentifier:@"showAddItem" sender:self];
  }
}

答案 1 :(得分:0)

我希望我能正确理解你的问题;如果我错了,请纠正我。您有一个在TableViewController中填充的待办事项列表,其中包含一些任务和一个(或多个)空单元格。当您单击这些单元格时,您需要调用[self performSegueWithIdentifier:@"showAddItem" sender:self];一种方法,该方法会显示ViewController,允许您在列表中添加更多项目。

以这样的方式填充TableViewController以使您有一个空单元格后,您始终可以获得空单元格的NSIndexPath

当您点按某个单元格时,系统会调用一个名为(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath的方法。如您所见,您将获得抽头单元格的索引信息。在那里,您可以像这样添加代码:

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    //Add your logic for the rest of the items

    //If you have 7 items in the to-do list, you would have 8 cell, 
    //the eight one being empty. If indexPath.row is equal to 8 then, 
    //it says that it MUST be the last item, that is empty
    if(indexPath.row == self.itemsInTheList.count) {
          [self performSegueWithIdentifier:@"showAddItem" sender:self];
    }
}

或者,您可以设置单元格的tag属性;那是另一天的故事。

答案 2 :(得分:0)

在我看来,这个解决方案是最干净的:

向您的UITableView backgroundView添加点按提示。如果backgroundViewnil,请添加透明UIView,然后向其添加手势。

现在将您的动作连接到此手势识别器。