2011-12-15 14 views
0

В настоящее время я разрабатываю приложение, которое ведет себя как Message.app. MasterViewController является основным видом, где он загружает таблицу имени контакта, времени и фрагмента самого последнего сообщения. Когда вы нажимаете на определенную ячейку, она переходит к DetailViewController, где она загружает сообщения, которые я отправил контакту, с последним, полным сообщением. Нажатие кнопки «Назад» возвращается к MasterViewController. Нажатие на rightBarButtonItem открывает ComposeViewController (модальный), где пользователь может составить сообщение конкретному контакту. Разница этого приложения с по умолчанию Message.app заключается в том, что он имеет таймер задержки до отправки сообщения. ComposeViewController имеет текстовое поле для ввода сообщения, кнопки для выбора контакта, кнопки для выбора временной задержки, кнопки для отправки, кнопки для отмены таймера и кнопки для отключения модуля ModalViewController.Как правильно добавлять и удалять объекты в tableview с помощью customviewviewcells?

Я удалил возможность отправлять фактическое SMS-сообщение целиком. Я просто представил пользователю предупреждение о том, что сообщение было отправлено, и если он хочет создать новый. Нажатие Cancel отменит ModalViewController и вернется к MasterViewController.

Проблема в том, что я не могу заставить строки появляться на столе, а также иметь возможность добавлять и удалять ячейки в таблице.

Вот некоторый код внутри viewDidLoad моего MasterViewController в:

[super viewDidLoad]; 
// Do any additional setup after loading the view, typically from a nib. 

// Delete button to delete messages 
UIBarButtonItem *deleteBarButtonItem = [[UIBarButtonItem alloc] 
             initWithBarButtonSystemItem:UIBarButtonSystemItemTrash 
             target:self 
             action:@selector(deleteText)]; 
self.navigationItem.leftBarButtonItem = deleteBarButtonItem; 


// Compose button to go to compose messages 
UIBarButtonItem *composeBarButtonItem = [[UIBarButtonItem alloc] 
             initWithBarButtonSystemItem:UIBarButtonSystemItemCompose 
             target:self 
             action:@selector(composeText)]; 
self.navigationItem.rightBarButtonItem = composeBarButtonItem; 

[deleteBarButtonItem release]; 
[composeBarButtonItem release]; 

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; 
NSString *message = [defaults objectForKey:kMessageText]; 
NSString *contactname = [defaults objectForKey:kContactNameText]; 
NSString *timestamp = [defaults objectForKey:kTimeStampText]; 

[messageDetails initWithObjectsAndKeys:contactname, kContactNameKey, message, kContactMsgKey, timestamp, kContactTimeKey, nil]; 

NSMutableArray *messageInfo = [[NSMutableArray alloc] initWithObjects:messageDetails, nil]; 

self.messagesList = messageInfo; 

[messageInfo release]; 

[super viewDidLoad]; 

Вот код в cellForRowAtIndexPath:

CustomCellViewController *customCell = (CustomCellViewController *)[tableView dequeueReusableCellWithIdentifier:@"CustomCellViewController"]; 

if (customCell == nil) 
{ 
    NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"CustomCellViewController" 
               owner:self 
               options:nil]; 
    for (id oneObject in nib) if ([oneObject isKindOfClass:[CustomCellViewController class]]) 
     customCell = (CustomCellViewController *)oneObject; 
} 

NSUInteger row = [indexPath row]; 
NSDictionary *messages = [self.messagesList objectAtIndex:row]; 

customCell.nameLabel.text = [messages objectForKey:kContactNameKey]; 
customCell.nameLabel.textColor = [UIColor whiteColor]; 
customCell.messageLabel.text = [messages objectForKey:kContactMsgKey]; 
customCell.messageLabel.textColor = [UIColor lightGrayColor]; 
customCell.timeLabel.text = [messages objectForKey:kContactTimeKey]; 
customCell.timeLabel.textColor = [UIColor blueColor]; 

customCell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; 

return customCell; 

Вот код для удаления клеток:

- (void)tableView:(UITableView *)tableView commitEditingStyle(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    if (editingStyle == UITableViewCellEditingStyleDelete) 
    { 
    // Delete the row from the data source.   
    [tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath]withRowAnimation:UITableViewRowAnimationFade]; 

    [messagesList removeObjectAtIndex:indexPath.row]; 
    [self.tableView reloadData]; 
    } 
    else if (editingStyle == UITableViewCellEditingStyleInsert) { 
    // Create a new instance of the appropriate class, insert it into the array, and add a new row to the table view. 
    } 
} 
+0

Местонахождение - это последний бит кода? Это будет создание нового экземпляра вашего контроллера главного представления, он не действует на вашу текущую главную таблицу. – jrturton

+0

Это расположено в реализации контроллера модального представления, где вы помещаете текст в текстовое поле и нажимаете кнопку, чтобы отклонить контроллер модального представления. – jaytrixz

ответ

0

Ваш последний фрагмент кода где вы создаете новый экземпляр контроллера главного представления, e проблема.

Это не тот контроллер, который вы ищете. Так как вы представили модально детальный вид контроллера, вы можете получить доступ к мастер-контроллеру через parentViewController свойство контроллера подробно:

MasterViewController *master = (MasterViewController*)self.parentViewController; 

Другие шаблоны проектирования, которые обычно используются в этой ситуации:

  • Создайте новый объект в главном контроллере и вставьте строку в таблицу перед передачей нового объекта контроллеру детали для обновления.
  • Создайте делегатский протокол для контроллера детали, к которому соответствует ваш главный контроллер. Установите контроллеры деталей на главный контроллер при его нажатии

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

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

Вы должны сделать измененную версию массива, возвращаемую из значений по умолчанию, поскольку она всегда возвращает неизменяемый массив.

В вашем методе cellForRow ... вы должны получить соответствующий словарь из массива и заполнить ячейку из него.

При добавлении новой строки вы должны создать новый словарь для перехода к контроллеру детали.

При удалении строки вы удаляете соответствующий словарь из массива.

+0

Большое спасибо jrturton! Я попробую ваши предложения. – jaytrixz

+0

Не принимаю ответ, пока он не заработает;) – jrturton

+0

Получил его. Я кое-что понял при редактировании кода. При добавлении ячеек я должен создать один изменяемый массив и один изменяемый словарь для контроллера детали и главного представления. Данные будут поступать из текстового поля внутри контроллера модального представления. Я уже обновил свой код. Если у вас есть время, вы можете посмотреть его здесь: http://dl.dropbox.com/u/7539490/texText.zip. Ошибок нет, но значения не отображаются в таблицах. :( – jaytrixz