2013-06-29 1 views
0

Я пытаюсь добавить ячейку в свой контроллер табличного представления из модального контроллера. Мой массив источников данных имеет несколько свойств (имя, временной интервал). Прямо сейчас у меня есть делегат/протокол в моем модульном контроллере просмотра, который отправляет данные в контроллер табличного представления. Однако по какой-то причине я могу добавить данные в массив, но я не могу добавить ячейку в tableview с этими данными. Вот мой код:Невозможно добавить ячейку в UITableView из Modal VC в таблицу VC (сложный)

ToDoTableViewController.h (TableViewController)

@interface ToDoTableViewController : UITableViewController <UITableViewDataSource, Properties2ViewControllerDelegate> 
{ 
IBOutlet UIView *headerView; 
} 
@property (strong, nonatomic) NSMutableArray *taskArray; 
-(UIView *)headerView; 
-(IBAction)addCell:(id)sender; 

ToDoTableViewController.m (TableViewController)

-(void) viewDidLoad{ 
    [[self tableView] setDataSource:self]; 
} 
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"UITableViewCell"]; 
    if (!cell) 
     cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"UITableViewCell"]; 
[[cell textLabel] setText:[taskArray objectAtIndex:[indexPath row]]]; 
    return cell; 
} 
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{ 
    return [taskArray count]; 
} 
-(IBAction)addCell:(id)sender{ 
    Properties2ViewController *pvc = [[Properties2ViewController alloc]init]; 
    [pvc setDelegate:self]; 
    [self presentViewController:pvc animated:YES completion:NULL]; 
} 
-(UIView *)headerView{ 
    if (!headerView){ 
     [[NSBundle mainBundle] loadNibNamed:@"HeaderView" owner:self options:nil];   
    } 
    return headerView; 
} 
-(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section{ 
    return [self headerView]; 
} 
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section{ 
    return [[self headerView] bounds].size.height; 
} 
-(void)viewWillAppear:(BOOL)animated{ 
    [super viewWillAppear:animated]; 
    [[self tableView] reloadData]; 
    } 
-(void)properties2ViewControllerDidEnterPropertiesSuccesfully:(Tasks *)t{ 
    [taskArray addObject:t]; 
} 

Properties2ViewController.h (ModalViewController)

@class Tasks; 
@protocol Properties2ViewControllerDelegate; 

@interface Properties2ViewController : UIViewController <UITextFieldDelegate>{ 
__weak IBOutlet UITextField *taskName; 
__weak IBOutlet UIButton *doneButton; 
    __weak IBOutlet UIDatePicker *datePicker; 
    __weak IBOutlet UILabel *label1; 
    __weak IBOutlet UILabel *label2; 
} 
@property (strong, nonatomic) Tasks *testTask; 
@property (weak, nonatomic) id <Properties2ViewControllerDelegate> delegate; 
-(IBAction)dismiss:(id)sender; 
-(IBAction)cancel:(id)sender; 
@end 

@protocol Properties2ViewControllerDelegate <NSObject> 

@optional 
-(void)properties2ViewControllerDidEnterPropertiesSuccesfully:(Tasks *)t; 
@end 

Properties2ViewController. m (ModalViewController)

-(IBAction)dismiss:(id)sender{ 
    testTask = [[Tasks alloc]initWith:[taskName text] :[datePicker countDownDuration] :[NSDate date]]; 
    if ([self.delegate respondsToSelector:@selector (properties2ViewControllerDidEnterPropertiesSuccesfully:)]){ 
     [self.delegate properties2ViewControllerDidEnterPropertiesSuccesfully:testTask]; 
    } 
    [self dismissViewControllerAnimated:YES completion:NULL]; 
} 
-(void)viewWillDisappear:(BOOL)animated{ 
    [super viewWillDisappear:animated]; 
} 
-(BOOL) textFieldShouldReturn:(UITextField *)aTextField{ 
    if (aTextField.tag == 1){ 
     [taskName resignFirstResponder]; 
    } 
    return YES; 
} 
-(void)viewDidDisappear:(BOOL)animated{ 
    [super viewDidDisappear:animated]; 
} 
-(IBAction)cancel:(id)sender{ 
    [self dismissViewControllerAnimated:YES completion:NULL]; 
} 
@end 

Вот свойства класса Task ... если это помогает на всех ...

@interface Tasks : NSObject 
@property (strong, nonatomic) NSString *taskName; 
@property NSTimeInterval timeInterval; 
@property NSDate *dateCreated; 

-(id)initWith:(NSString *)tskNme :(NSTimeInterval)timeInt :(NSDate *)dateCreat; 
@end 

--- EDIT ----- Так что я попытался положить это в моем метод properties2ViewControllerDidEnterPropertiesSuccesfully делегат, но ячейка еще не создана ...:

-(void)properties2ViewControllerDidEnterPropertiesSuccesfully:(Tasks *)t{ 
    [taskArray addObject:t]; 
    [self.tableView reloadData]; 
    int lastRow = [[self tableView] numberOfRowsInSection:0]; 
    NSIndexPath *ip = [NSIndexPath indexPathForItem:lastRow inSection:0]; 
    [self.tableView cellForRowAtIndexPath:ip]; 
} 

Кроме того, если я переключить

[self.tableView cellForRowAtIndexPath:ip]; 

с

[self.tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:ip] withRowAnimation:UITableViewRowAnimationTop]; 

того исключение выбрасывается (Нагрузочное приложение из-за неперехваченное исключение «NSInternalInconsistencyException», причина: «попытка вставить строку 0 в раздел 0, но есть только 0 строк в разделе 0 после обновление ')

+0

Ваш Properties2ViewController.h так же, как ваш ToDoTableViewController.h. Может быть, опубликовать правильный код для Properties2ViewController, чтобы мы могли проверить это? – ophychius

+0

omg как я не заметил, что ... исправлено – EvilAegis

ответ

0

Погрешность вы получаете в конце говорит о том, что запись никогда не делает это в Массив. Можете ли вы проверить длину своего массива после вызова [taskArray addObject: t]; ? Кроме того, проверьте значение объекта (t) и посмотрите, действительно ли передана надлежащая testTask.

Кажется, вы фактически не создаете taskArray, просто объявите его. Попробуйте добавить это в ваших ToDoTableViewControllers viewDidLoad

taskArray = [[NSMutableArray alloc] init]; 
+0

Хм .. ты прав. Я проверил taskArray после того, как я добавил объект t, и счетчик был все еще 0. однако значение taskName и значение timeInterval были успешно пройдены. – EvilAegis

+0

@ user2533646 Я добавил возможное решение на основе вашей обратной связи – ophychius

+0

OMG THAT WORKED. ДА!! ТЫ ВЕЛИКОЛЕПЕН. Я ТАК СЧАСТЛИВ!!!!!!! БЛАГОДАРИМ ВАС, ЧТО Я МОГУ БЫТЬ РАБОТАЕТ НА ЭТО, КАК 8 ЧАСОВ !!! – EvilAegis

1

вы можете попробовать [Tableview reloadData] в

- properties2ViewControllerDidEnterPropertiesSuccesfully 
+0

Я просто пробовал, что, к сожалению, он не добавил никаких ячеек :( – EvilAegis

+0

После свойств2ViewControllerDidEnterPropertiesSuccesfully вызывает [tableView reloadData], является tableView: cellForRowAtIndexPath? – rocky

+0

Я так не считаю. Какой бы индексный путь был? – EvilAegis