Перезагрузка UITableView - Xcode 5

Я использую UITableView (с ячейкой таблицы), встроенный в контроллер навигации. Когда приложение запускается, данные из базы данных SQLite3 считываются и добавляются в ячейки таблицы.

Я сделал кнопку (на панели навигации), которая направит пользователя на экран, где он сможет вводить новые данные. "Сохранить" происходит, когда пользователи нажимают "Назад", кнопки, которые автоматически добавляются навигационным контроллером.

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

Какой лучший способ обновить данные, когда они вернутся в представление?

#import "lucidViewController.h"
#import "lucidCell.h"

@interface lucidViewController () {
}

@end

@implementation lucidViewController
@synthesize titleData,descrData,idKeyData;

- (void)viewDidLoad {
 self.myTableView.dataSource = self;
 self.myTableView.delegate = self;

 [self openDB];
 [self createTable:@"dreams" withField1:@"idKey" withField2:@"title" withField3:@"description"];

 titleData = [[NSMutableArray alloc] init];
 descrData = [[NSMutableArray alloc] init];
 idKeyData = [[NSMutableArray alloc] init];

 [self loadData];

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

- (void) loadData {
 NSString *sql = [NSString stringWithFormat:@"SELECT * FROM dreams"];
 sqlite3_stmt *statement;

 if (sqlite3_prepare_v2(dataBase, [sql UTF8String], -1, &statement, nil) == SQLITE_OK) {
 while (sqlite3_step(statement) == SQLITE_ROW) {
 char *field1 = (char *) sqlite3_column_text(statement, 0);
 NSString *field1Str = [[NSString alloc]initWithUTF8String:field1];

 char *field2 = (char *) sqlite3_column_text(statement, 1);
 NSString *field2Str = [[NSString alloc]initWithUTF8String:field2];

 char *field3 = (char *) sqlite3_column_text(statement, 2);
 NSString *field3Str = [[NSString alloc]initWithUTF8String:field3];

 [idKeyData addObject:field1Str];
 [titleData addObject:field2Str];
 [descrData addObject:field3Str];
 }
 }
}

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

- (NSString *) filePath {
 NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
 return [[paths objectAtIndex:0] stringByAppendingPathComponent:@"lucid.sql"];
}

- (void) openDB {
 if (sqlite3_open([[self filePath] UTF8String], &dataBase) != SQLITE_OK) {
 sqlite3_close(dataBase);
 NSAssert(0, @"Database kan niet geopend worden");
 } else {
 NSLog(@"Database is geopend!");
 }
}

- (void) createTable:(NSString *)tableName withField1:(NSString *)field1 withField2:(NSString *)field2 withField3:(NSString *)field3 {
 char *error;
 NSString *sqlStatement = [NSString stringWithFormat:
 @"CREATE TABLE IF NOT EXISTS '%@'('%@' TEXT PRIMARY KEY, '%@' TEXT, '%@' TEXT);",tableName,field1,field2,field3];
 if (sqlite3_exec(dataBase, [sqlStatement UTF8String], NULL, NULL, &error) != SQLITE_OK) {
 sqlite3_close(dataBase);
 NSLog(@"Table kan niet aangemaakt worden..");
 } else {
 NSLog(@"Table aangemaakt!");
 }
}

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

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

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
 return 0;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
 static NSString *CellIdentifier = @"Cell";
 lucidCell *Cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
 if (!Cell) {
 Cell = [[lucidCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
 }
 Cell.descrLabel.text = [self.descrData objectAtIndex:indexPath.row];
 Cell.titleLabel.text = [self.titleData objectAtIndex:indexPath.row];
 return Cell;
}
@end

Новые данные добавляются здесь:

#import "newViewController.h"

@interface newViewController ()

@end

@implementation newViewController
@synthesize addNewDream;

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
 self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
 if (self) {
 // Custom initialization
 }
 return self;
}

- (void)viewDidLoad {
 [self openDB];
 [self genRandStringLength:20];
 [super viewDidLoad];
 // Do any additional setup after loading the view.
}

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

- (NSString *) filePath {
 NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
 return [[paths objectAtIndex:0] stringByAppendingPathComponent:@"lucid.sql"];
}

- (void) openDB {
 if (sqlite3_open([[self filePath] UTF8String], &dataBase) != SQLITE_OK) {
 sqlite3_close(dataBase);
 NSAssert(0, @"Database kan niet geopend worden");
 } else {
 NSLog(@"Database is geopend!");
 }
}

-(NSString *) genRandStringLength: (int) len {
 NSString *letters = @"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
 NSMutableString *randomString = [NSMutableString stringWithCapacity: len];

 for (int i=0; i
1 ответ

Вы можете обновить таблицу и datamodel в методе viewDidAppear следующим образом:

-(void)viewDidAppear:(BOOL)animated {

 [super viewDidAppear:animated]; 

 [self loadData]; 
 [self.myTableView reload]; 
}

licensed under cc by-sa 3.0 with attribution.