Обнаружение касания вне ячеек tableview для выполнения действия

#ios #tableview

#iOS #просмотр таблицы

Вопрос:

Я новичок в разработке iOS, я следил за вводной частью apple для iOS и внедрил приложение «список дел».

У меня есть tableview, который показывает список текущего списка дел, и другой контроллер представления, который позволяет пользователю добавлять новый элемент в текстовое поле, а затем добавлять в список. У меня есть маленький поверх моего tableview, который выполняет переходное действие к представлению «Добавить элемент».

Я хочу иметь возможность выполнять то же действие, если пользователь нажимает на пустую ячейку, я попытался ввести этот код, и он работает, но я хочу поместить его в правильное положение, чтобы он срабатывал только тогда, когда пользователь попадает в пустое место в таблице:

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

Ответ №1:

На мой взгляд, это решение является самым чистым:

Добавьте жест касания к своим UITableView . backgroundView Если backgroundView есть nil , добавьте прозрачный UIView и добавьте к нему жест.

Теперь подключите свое действие к этому распознавателю жестов.

Ответ №2:

Я вижу здесь как минимум два решения.

Решение 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];
  }
}
  

Ответ №3:

Надеюсь, я правильно понял ваш вопрос; поправьте меня, если я ошибаюсь. У вас есть список дел, заполненный в a TableViewController , в котором есть несколько задач и одна (или несколько) пустых ячеек. Когда вы нажимаете на эти ячейки, вам нужно вызвать [self performSegueWithIdentifier:@"showAddItem" sender:self]; метод, который представляет a 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 свойство ячейки; и это история для другого дня.

Комментарии:

1. Это не сработало, я знаю, что этот метод срабатывает при использовании tap в tableviewcell, дело в том, что мне кажется, когда я удаляю все свои элементы из списка tableview, а tableview пуст, кажется, что эти пустые ячейки недоступны или больше не запускают этот метод..

2. Вот что вам нужно сделать. Вы должны установить self.tableView .delegate = self и self.tableView.dataSource = self .

3. И есть метод, -(NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section . Здесь возвращает на одно число больше, чем количество элементов в списке. Что-то вроде return self.itemsInTheList.count 1 И здесь, (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath напишите таким образом, что если indexPath.row == self.itemsInTheList.count оно пустое.

4. куда мне это поместить? в методе (void)TableView:(UITableView *)TableView выбрано значение indexPath:(NSIndexPath *)indexPath ?

5. Это также не сработало … извините, я, вероятно, новичок и не уверен, правильно ли я делаю то, что вы мне говорите