#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. Это также не сработало … извините, я, вероятно, новичок и не уверен, правильно ли я делаю то, что вы мне говорите