2014-01-29 5 views
0

Я просто тренируюсь с помощью UITableView. Вот что я сделал до сих пор.Удалите настроенные строки из UITableView

  • made cell with xib.file с нуля.
  • Данные хранятся в P-списке.
  • Использование [ MutableCopy] и преобразовать массив в mutableArray
  • Это выглядит немного странно, но я сделал связь делегата с помощью раскадровки, так что нет никакой линии «self.tableView.delegate = self» здесь.

Теперь проблема в том, что я могу удалить объекты в mutableArray, но не в пользовательском интерфейсе. Выбранная строка остается на столе. Я знаю «- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath» метод делегирования работает, но что-то не так.

Любые советы приветствуются! Спасибо :)

![#import "ViewController.h" 
#import "Model.h" 
#import "SimpleTableCell.h" 

@interface ViewController() 
{ 

    NSMutableArray *_recipesMC; 
    NSMutableArray *_imagesMC; 

    Model *_model; 
} 

@end 

@implementation ViewController 

- (void)viewDidLoad 
{ 
    \[super viewDidLoad\]; 
    // Do any additional setup after loading the view, typically from a nib. 

    Model *model = \[\[Model alloc\] init\]; 
    \[model getBack\]; 

    NSArray *recipes = model.recipes; 
    NSArray *images = model.imagesArray; 

    _recipesMC = \[recipes mutableCopy\]; 
    _imagesMC = \[images mutableCopy\]; 


} 

- (void)didReceiveMemoryWarning 
{ 
    \[super didReceiveMemoryWarning\]; 
    // Dispose of any resources that can be recreated. 
} 



# pragma mark delegat patern 


- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 
    return \[_recipesMC count\]; 

} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    NSString *cellIdentifier = @"SimpleTableCell"; 


    SimpleTableCell *cell = (SimpleTableCell *)\[tableView dequeueReusableCellWithIdentifier:cellIdentifier\]; 


    if(cell == nil) 
    { 

     NSArray *nib = \[\[NSBundle mainBundle\] loadNibNamed:@"Empty" owner:self options:nil\]; 
     cell = \[nib objectAtIndex:0\]; 

    } 

    cell.nameLabel.text = \[_recipesMC objectAtIndex:indexPath.row\]; 

    if (indexPath.row < \[_recipesMC count\] - 1) 
    { 
     UIImage *image = \[UIImage imageNamed:_imagesMC\[indexPath.row\]\]; 
     cell.thumbnailImageView.image = image; 

    } 


    return cell; 

} 

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    return 78; 

} 


# pragma mark delegate touch 


- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    NSLog(@"%li",(long)indexPath.row); 

    UIAlertView *alert = \[\[UIAlertView alloc\] initWithTitle:@"HEY" message:\[NSString stringWithFormat:@"%@",_recipesMC\[indexPath.row\]\] delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil\]; 
    \[alert show\]; 

    UITableViewCell *cell = \[tableView cellForRowAtIndexPath:indexPath\]; 

    if (cell.accessoryType != 
     UITableViewCellAccessoryNone) { 


     cell.accessoryType = 
     UITableViewCellAccessoryNone; 

    } 
    else 
    { 
     cell.accessoryType = UITableViewCellAccessoryCheckmark; 
    } 


    \[self performSegueWithIdentifier:@"CellSelectionSegue" sender:self\]; 

} 



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

    NSLog(@"Clicked DELETE BUTTON at %i",indexPath.row); 

    \[_recipesMC removeObjectAtIndex:indexPath.row\]; 
    \[_imagesMC removeObjectAtIndex:indexPath.row\]; 

    \[self.tableView reloadData\]; 

    NSLog(@"count = %i",\[_recipesMC count\]); 

} 



# pragma mark Segue 

- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    NSLog(@"Segue"); 
} 


@end 
+1

Вы уверены, что 'self.tableView' не' nil'? – AncAinu

ответ

1

Я уверен, что ваш self.tableView is nil.

Это потому, что даже если вы настроите себя как источник данных и делегата, ваша таблица будет работать, но здесь вы, кажется, создали свой UITableView *tableView, но не связали его через свой интерфейс (если вы делаете это с помощью построителя).

Или вы можете просто позвонить tableView, а не self.tableView, потому что делегат protocole дает вам таблицу.

Просто сделайте это, и он будет работать. И затем, вы можете попробовать решение Szu.

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

    NSLog(@"Clicked DELETE BUTTON at %i",indexPath.row); 

    [_recipesMC removeObjectAtIndex:indexPath.row]; 
    [_imagesMC removeObjectAtIndex:indexPath.row]; 

    [tableView reloadData]; 

    NSLog(@"count = %i",[_recipesMC count]); 

} 
+0

Спасибо! Я пропустил подключение self.tableView к построителю интерфейса. – Tosh

+0

Оба они работают очень хорошо. Я действительно ценю твою помощь. – Tosh

1

Yo должен вызывать deleteRowsAtIndexPath:wothRowAnimation:

например в моем коде:

if (editingStyle == UITableViewCellEditingStyleDelete) { 
     ElKeyValuePair *pair = [self.locationFavoritesKeyArr objectAtIndex:[indexPath row]]; 
     [self.locationFavoritesKeyArr removeObjectAtIndex:[indexPath row]]; 
     ELCarpark *carpark = [self.agglomeration carparkForUid:[pair.val1 intValue]]; 
     [carpark removeFromFavoritesAgglomerationUid:self.agglomeration.uid]; 
     [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade]; 
    } 
+1

Поскольку он называет 'reloadData'it не нужен. Кажется, что его 'reloadData' не работает. – AncAinu

+0

Да, это так. Я просто не понимаю, почему reloadData не работает. Он знает, что метод должен работать, но в то время tableView не извлекал данные из plist и не использовал xib.file для изменения ячеек. – Tosh

+0

Спасибо Szu :) теперь он работает с классной анимацией !! – Tosh

0

Добавление этого кода в методе tableView:commitEditingStyle:forRowAtIndexPath следует удалить строку из источника данных и пользовательского интерфейса.

 
if (editingStyle == UITableViewCellEditingStyleDelete) 
{ 
[_recipesMC removeObjectAtIndex:indexPath.row]; 
[_imagesMC removeObjectAtIndex:indexPath.row]; 
[tableView deleteRowsAtIndexPaths:indexPath withRowAnimation:YES]; 
} 

Окончательно удалите инструкцию reloadData.

+0

Спасибо appzYourLife! – Tosh

Смежные вопросы