Редактировать и удалять несколько строк в UITableView одновременно - PullRequest
6 голосов
/ 03 июня 2011

В моем приложении мне нужно удалить несколько строк в таблице, отредактировать таблицу и установить флажок рядом с таблицей. Если флажок установлен, то ячейки таблицы удаляются. Это как приложение для iPhone. Как я могу это сделать, пожалуйста, помогите мне.

Ответы [ 4 ]

18 голосов
/ 03 июня 2011

Если я правильно понимаю ваш вопрос, вы, по сути, хотите пометить UITableViewCell с (галочкой); затем, когда пользователь нажимает главную кнопку «Удалить», все , отмеченные UITableViewCell s, удаляются из UITableView вместе с соответствующими им объектами источника данных.

Чтобы реализовать часть с галочкой , вы можете переключиться между UITableViewCellAccessoryCheckmark и UITableViewCellAccessoryNone для свойства UITableViewCell s accessory. Обработка касаний в следующем UITableViewController методе делегата:

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

    UITableViewCell *c = [tableView cellForRowAtIndexPath:indexPath];
    if (c.accessoryType == UITableViewCellAccessoryCheckmark) {
        [c setAccessoryType:UITableViewCellAccessoryNone];
    }
    //else do the opposite

}

Вы также можете посмотреть на этот пост относительно пользовательских UITableViewCell s, если вам нужна более сложная галочка .

Мастер-кнопку «Удалить» можно настроить двумя способами:

В любом случае, в конце концов, метод должен быть вызван при нажатии главной кнопки «Удалить». Этот метод просто должен пройти по UITableViewCells в UITableView и определить, какие из них помечены. Если отмечено, удалите их. Предполагая только один раздел:

NSMutableArray *cellIndicesToBeDeleted = [[NSMutableArray alloc] init];
for (int i = 0; i < [tableView numberOfRowsInSection:0]; i++) {
    NSIndexPath *p = [NSIndexPath indexPathWithIndex:i];
    if ([[tableView cellForRowAtIndexPath:p] accessoryType] == 
        UITableViewCellAccessoryCheckmark) {
        [cellIndicesToBeDeleted addObject:p];
        /*
            perform deletion on data source
            object here with i as the index
            for whatever array-like structure
            you're using to house the data 
            objects behind your UITableViewCells
        */
    }
}
[tableView deleteRowsAtIndexPaths:cellIndicesToBeDeleted
                 withRowAnimation:UITableViewRowAnimationLeft];
[cellIndicesToBeDeleted release];

Предполагая, что под «правкой» вы подразумеваете «удалить одну UITableViewCell» или «переместить одну UITableViewCell», вы можете реализовать следующие методы в UITableViewController:

- (void)viewDidLoad {
    [super viewDidLoad];

    // This line gives you the Edit button that automatically comes with a UITableView
    // You'll need to make sure you are showing the UINavigationBar for this button to appear
    // Of course, you could use other buttons/@selectors to handle this too
    self.navigationItem.rightBarButtonItem = self.editButtonItem;

}

// Override to support conditional editing of the table view.
- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath {
    // Return NO if you do not want the specified item to be editable.
    return YES;
}

- (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath {
    return YES;
}

- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath {

    if (editingStyle == UITableViewCellEditingStyleDelete) {
        //perform similar delete action as above but for one cell
    }   
}

- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)fromIndexPath toIndexPath:(NSIndexPath *)toIndexPath {
    //handle movement of UITableViewCells here
    //UITableView cells don't just swap places; one moves directly to an index, others shift by 1 position. 
}
2 голосов
/ 03 июня 2011

Вы можете установить 1 UIButton, назовите его «РЕДАКТИРОВАТЬ» и подключите его к IBAction.В IBAction напишите, чтобы вы могли делать в соответствии с вашими требованиями.

 -(IBAction)editTableForDeletingRow
 {
      [yourUITableViewNmae setEditing:editing animated:YES];
 }

Это добавит круглые красные кнопки в левом углу, и вы можете нажать на эту кнопку Delete, появится кнопка, нажмите на эту строкубудут удалены.

Вы можете реализовать метод делегата UITableView следующим образом.

 -(UITableViewCellEditingStyle)tableView: (UITableView *)tableView editingStyleForRowAtIndexPath: (NSIndexPath *)indexPath
 { 
      //Do needed stuff here. Like removing values from stored NSMutableArray or UITableView datasource 
 }

Надеюсь, это поможет.

1 голос
/ 07 января 2014

Я нашел очень хороший код. Пожалуйста, используйте этот код для реализации определенной функциональности. Учебник Ссылка

1 голос
/ 03 июня 2011

, который вы хотите найти deleteRowsAtIndexPath, со всем вашим кодом, сжатым между [yourTable beginUpdates] & [yourTable endUpdates];

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...