2016-10-24 3 views
1

Ich versuche Anzeigezellen in einem UITableView aber neu hinzugefügten Zellen werden nicht angezeigt, es sei denn, viewDidLoad verwendet wird.UITableView Objective-C bevölkert nicht richtig

Full list

Dies ist die vollständige Liste: Wenn ich zum New Note Bildschirm gehen und kommen zurück, das ist in Ordnung, aber wenn dieser Bildschirm verschwinden die Notiz Titel von der Seite Menü zugegriffen wird New, bis ich auf die New Note klicken Knopf und komm zurück.

Unten ist der Code für diese Seite:

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    NSMutableArray *leftButtonsArray = [self.navigationItem.leftBarButtonItems mutableCopy]; 
    UIBarButtonItem *newNoteButton = [[UIBarButtonItem alloc] initWithTitle:@"New Note" style:UIBarButtonItemStyleBordered target:self action:@selector(addNote:)]; 
    [leftButtonsArray addObject:newNoteButton]; 
    self.navigationItem.leftBarButtonItems = leftButtonsArray; 
} 

-(void)viewWillAppear:(BOOL)animated{ 
    [super viewWillAppear:animated]; 
    self.notes = [NSMutableArray array]; 

    ontracAppDelegate *delegate = (ontracAppDelegate*)[[UIApplication sharedApplication] delegate]; 
    NSManagedObjectContext *moc = [delegate managedObjectContext]; 

    NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Notes"]; 
    [request setReturnsObjectsAsFaults:NO]; 
    NSError *error = nil; 

    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"updated" ascending:NO]; 
    [request setSortDescriptors:@[sortDescriptor]]; 

    NSArray *results = [moc executeFetchRequest:request error:&error]; 
    NSSortDescriptor *sd = [[NSSortDescriptor alloc] initWithKey:@"updated" ascending:NO]; 

    NSArray *sortDescriptors = [NSArray arrayWithObject:sd]; 
    NSArray *sortedArray = [results sortedArrayUsingDescriptors:sortDescriptors]; 

    NSNumber * NOTEID = @"noteID"; 
    NSString * PACKID = @"pack_id"; 
    NSString * NOTE = @"note"; 
    NSString * CREATED = @"created"; 
    NSString * UPDATED = @"updated"; 

    NSDictionary * dict; 

    [self.notes removeAllObjects]; 

    for(Notes *note in results){ 

     if(self.dataObject.pack_id == [note.dataObject.dataPack.pack_id integerValue]){ 
      dict = [NSDictionary dictionaryWithObjectsAndKeys: 
       note.noteID, NOTEID, 
       note.pack_id, PACKID, 
       note.note, NOTE, 
       note.created, CREATED, 
       note.updated, UPDATED, 
       nil]; 

      if((note.created == nil || note.updated == nil || note.noteID == nil)){ 
       [moc deleteObject:note]; 
      }else{ 
       [self.notes addObject:dict]; 
      } 
     } 
    } 

    NSLog(@"mArray %@", self.notes); 

} 
-(void)viewDidDisappear:(BOOL)animated{ 
    [super viewDidDisappear:animated]; 
} 
-(void)viewDidAppear:(BOOL)animated{ 
    [super viewDidAppear:animated]; 
} 

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 
{ 
    return 1; 
} 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:   (NSInteger)section 
{ 
    NSLog(@"notes count: %lu", (unsigned long)[self.notes count]); 
    return [self.notes count]; 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    UITableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:@"myCell"]; 
    if (!cell) 
    { 
     cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"myCell"]; 
    } 

    NSMutableDictionary *d = [self.notes objectAtIndex:indexPath.row]; 
    //NSNumber *noteID = [d valueForKey:@"noteID"]; 
    NSString *note = [d valueForKey:@"note"]; 
    NSString *created = [d valueForKey:@"created"]; 
    NSString *updated = [d valueForKey:@"updated"]; 

    cell.textLabel.text = note; 
    cell.detailTextLabel.text = [NSString stringWithFormat:@"Date Created: %@ | Last Updated %@", created, updated]; 
    cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; 

    return cell; 
} 

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    NSMutableDictionary *d = [self.notes objectAtIndex:indexPath.row]; 
    NSNumber *noteID = [d valueForKey:@"noteID"]; 
    NID = noteID; 

    ontracSuperClassViewController *viewController = [[ontracNotesViewController alloc] init]; 
    [self.navigationController pushViewController:viewController animated:YES]; 
} 
-(IBAction)addNote:(id)sender{ 
    NID = [NSNumber numberWithInteger:-1]; 
    ontracSuperClassViewController *viewController = [[ontracNotesViewController alloc] init]; 
    [self.navigationController pushViewController:viewController animated:YES]; 
} 
- (void)didReceiveMemoryWarning 
{ 
    [super didReceiveMemoryWarning]; 
} 
+1

Nach 'NSLog (@ "Marray% @", self.notes);', 'tun [ yourTableView reloadData]; ', oder verwenden Sie einen' NSFetchedResultsController'? – Larme

+0

wie Sie sagen, Sie haben eine neue Notizen im neuen Viewcontroller dann nsnotificationcenter addobserver und rufen Sie diese Methode von neuen Viewcontroller und aktualisieren Sie Ihr Array mit neuen Wert und Tabelle neu laden –

+0

Wenn U zum zweiten View-Controller geschoben, was verwenden Sie, um zurück zu bekommen Hier ? –

Antwort

2

Wenn Sie Ihre Array mit den neuesten aktualisierten Daten füllen dann Sie muss tableview neu laden, um die neuesten Daten anzuzeigen. Also, wenn Ihr self.notes druckt Daten aktualisiert richtig in viewWillAppear in NSLog dann müssen Sie nur reload Ihre tableview wie

[tableView reloadData]; 

und wenn Sie die Daten nicht in self.notes immer aktualisiert dann zuerst das lösen und dann tableview neu laden!

2

, wenn Sie nach dem Hinzufügen neuer Knoten neu zu laden nur die Tableview neue Notiz in dieser Funktion hinzufügen

1

diese Zeile in Ihrer viewDidLoad() Methode hinzufügen

NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(self.Methodtablereloadata(_:)), name:"NotificationIdentifier", object: nil) 


-(void) Methodtablereloadata(notification: NSNotification){ 
     //Take Action on Notification 
     self.notes = [NSMutableArray array]; 

ontracAppDelegate *delegate = (ontracAppDelegate*)[[UIApplication sharedApplication] delegate]; 
NSManagedObjectContext *moc = [delegate managedObjectContext]; 

NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Notes"]; 
[request setReturnsObjectsAsFaults:NO]; 
NSError *error = nil; 

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"updated" ascending:NO]; 
[request setSortDescriptors:@[sortDescriptor]]; 

NSArray *results = [moc executeFetchRequest:request error:&error]; 
NSSortDescriptor *sd = [[NSSortDescriptor alloc] initWithKey:@"updated" ascending:NO]; 

NSArray *sortDescriptors = [NSArray arrayWithObject:sd]; 
NSArray *sortedArray = [results sortedArrayUsingDescriptors:sortDescriptors]; 

NSNumber * NOTEID = @"noteID"; 
NSString * PACKID = @"pack_id"; 
NSString * NOTE = @"note"; 
NSString * CREATED = @"created"; 
NSString * UPDATED = @"updated"; 

NSDictionary * dict; 

[self.notes removeAllObjects]; 

for(Notes *note in results){ 

    if(self.dataObject.pack_id == [note.dataObject.dataPack.pack_id integerValue]){ 
     dict = [NSDictionary dictionaryWithObjectsAndKeys: 
      note.noteID, NOTEID, 
      note.pack_id, PACKID, 
      note.note, NOTE, 
      note.created, CREATED, 
      note.updated, UPDATED, 
      nil]; 

     if((note.created == nil || note.updated == nil || note.noteID == nil)){ 
      [moc deleteObject:note]; 
     }else{ 
      [self.notes addObject:dict]; 
     } 
    } 
    } 
    [YOURTABLE reloadData]; 
} 

Ihren nächsten viewcontoller, die Sie neue Notizen hinzufügen. Kommentar abgeben Notizen schreiben Sie einfach eine Zeile für Reload-Tabelle

NSNotificationCenter.defaultCenter().postNotificationName("NotificationIdentifier", object: nil) 

Siehe diesen Link

https://developer.apple.com/reference/foundation/nsnotificationcenter

Verwandte Themen