Я понимаю, что вы пытаетесь сделать сейчас.
Я бы порекомендовал создать класс для хранения данных для каждого напоминания, тогда у вас может быть массив данных напоминания.
Поэтому я бы добавил новый класс в ваш проект, назвал его «Напоминание», а затем добавил свойство для каждого из ваших полей.
Ваш класс напоминания будет выглядеть следующим образом:
Reminder.h
#import <Foundation/Foundation.h>
@interface Reminder : NSObject
@property (nonatomic, copy) NSString *reminderId;
@property (nonatomic, copy) NSString *name;
@property (nonatomic, copy) NSString *event;
@property (nonatomic, copy) NSString *date;
@end
, а ваш файл Remder.m будет:
#import "Reminder.h"
@implementation Reminder
@synthesize reminderId, name, event, date;
-(void)dealloc
{
self.reminderId = nil;
self.name = nil;
self.event = nil;
self.date = nil;
}
@end
Так что этот класс будет просто хранить данные для каждого из ваших напоминаний.
Затем в вашем контроллере представления, который показывает список напоминаний, вам нужно добавить свойство массива для хранения объектов напоминания.
Поэтому добавьте следующее свойство в свой ViewController, который показывает список напоминаний.
@property (nonatomic, retain) NSMutableArray *reminders;
убедитесь, что вы также синтезируете это в файле .m ваших контроллеров представления, чтобы сделать это, добавьте эту строку кода под @строка реализации в файле .m вашего контроллера представления:
@synthesize reminders;
Также не забудьте установить для свойства напоминаний значение nil в вашем методе dealloc для обеспечения надлежащей очистки памяти:
self.reminders = nil;
Мы будемиспользуя класс Reminder, который мы создали в контроллере представления, поэтому вам также необходимо импортировать свой класс, поэтому в файле .m контроллера представления добавьте оператор импорта в верхней части файла следующим образом:
#import "Reminder.h"
Теперь ваш контроллер представления настроен и готов использовать созданный нами класс напоминаний.
Затем вам необходимо добавить метод в ваш контроллер представления, который будет использоваться для загрузки данных из базы данных.и заполните объекты напоминаний и массив напоминаний.
Добавьте новый метод в свой контроллер представления, назовите его что-то вроде loadReminders
Реализация этого метода будет:
-(void)loadReminders
{
// setup the reminders array
self.reminders = nil;
self.reminders = [[[NSMutableArray alloc] init] autorelease];
//Retrieve the values of database
const char *dbpath = [self.databasePath UTF8String];
sqlite3_stmt *statement;
if (sqlite3_open(dbpath, &remindersDB) == SQLITE_OK)
{
NSString *querySQL = [NSString stringWithFormat:@"SELECT * FROM reminders"];
NSLog(@"Data = %@",querySQL);
const char *query_stmt = [querySQL UTF8String];
if (sqlite3_prepare_v2(self.remindersDB ,query_stmt , -1, &statement, NULL) == SQLITE_OK)
{
while (sqlite3_step(statement) == SQLITE_ROW)
{
Reminder *loadedReminder = [[Reminder alloc] init];
loadedReminder.reminderId = [[[NSString alloc] initWithUTF8String:(const char *) sqlite3_column_text(statement, 0)]autorelease];
loadedReminder.name = [[[NSString alloc]initWithUTF8String:(const char *) sqlite3_column_text(statement, 1)]autorelease];
loadedReminder.event = [[[NSString alloc]initWithUTF8String:(const char *) sqlite3_column_text(statement, 2)]autorelease];
loadedReminder.date = [[[NSString alloc]initWithUTF8String:(const char *) sqlite3_column_text(statement, 3)]autorelease];
[self.reminders addObject:loadedReminder];
[loadedReminder release];
}
sqlite3_finalize(statement);
}
sqlite3_close(self.remindersDB);
}
}
Так что этот метод делает загрузку строк из базы данных, и для каждой строки в базе данных он создает новый объект Reminder, устанавливая свойства, используя данные из строки, затем добавляя этот объект напоминания к напоминаниям.массив.
обратите внимание на изменение, которое я внес в ваш исходный код:
while (sqlite3_step(statement) == SQLITE_ROW)
, в то время как оператор while будет циклически повторяться и извлекать каждую строку из базы данных.
Вы бывызывайте этот новый метод (loadReminders) всякий раз, когда вы хотите обновить список данных, поэтому в любом месте кода, где вы находитесьЕсли вы перезагрузите таблицу, вызовите этот метод, прежде чем перезагружать таблицу, это обеспечит готовность массива напоминаний для использования таблицей при перезагрузке.Поэтому в приведенном выше примере я бы заменил ваш метод viewWillAppear следующим образом:
-(void)viewWillAppear:(BOOL)animated
{
[self loadReminders];
[self.theTable reloadData];
}
Теперь все данные настроены и готовы к использованию.А использование объекта напоминания должно значительно облегчить чтение кода в вашем tableView.
Таким образом, чтобы получить ваши данные в таблицу, замените текущие методы tableView следующим:
-(NSInteger)numberOfSectionsInTableView:(UITableView *)view
{
return [self.reminders count];
}
Это скажет таблице создать раздел для каждого напоминания в массиве напоминаний.
Теперь из вашего описания (и ссылки) вы создаете 1 ячейку в каждом разделе.Поэтому добавьте следующий метод, чтобы сообщить tableView, что мы хотим, чтобы по 1 строке для каждого раздела
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return 1;
}
Прямо сейчас для cellForRowAtIndexPath, заменили ваш текущий метод следующим:
- (UITableViewCell *)tableView:(UITableView *)view cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
Reminder *reminderToDisplay;
reminderToDisplay = [self.reminders objectAtIndex:indexPath.section];
// Now create the cell to display the reminder data:
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:nil] autorelease];
view.backgroundColor = [UIColor clearColor];
cell.backgroundColor = [[UIColor alloc]initWithPatternImage:[UIImage imageNamed:@"reminderbutton.png"]];
label1 = [[[UILabel alloc]initWithFrame:CGRectMake(26, 3, 30, 40)]autorelease];
label1.backgroundColor = [UIColor clearColor];
label1.textColor = [UIColor whiteColor];
label2 = [[[UILabel alloc]initWithFrame:CGRectMake(45, 3, 100, 40)]autorelease];
label2.backgroundColor = [UIColor clearColor];
label2.textColor = [UIColor whiteColor];
label3 = [[[UILabel alloc]initWithFrame:CGRectMake(119, 3, 100, 40)]autorelease];
label3.backgroundColor = [UIColor clearColor];
label3.textColor = [UIColor whiteColor];
label4 = [[[UILabel alloc]initWithFrame:CGRectMake(198, 3, 120, 40)]autorelease];
label4.backgroundColor = [UIColor clearColor];
label4.textColor = [UIColor whiteColor];
// Now set the labels using our reminder object
label1.text = reminderToDisplay.reminderId;
label2.text = reminderToDisplay.name;
label3.text = reminderToDisplay.event;
label4.text = reminderToDisplay.date;
// now add the labels to the cell
cell.contentView = [[UIView alloc] init] autorelease]
[cell.contentView addSubview:label1];
[cell.contentView addSubview:label2];
[cell.contentView addSubview:label3];
[cell.contentView addSubview:label4];
return cell;
}
Так чтопроисходит в этом методе, сначала мы получаем напоминание для текущего раздела из массива напоминаний:
Reminder *reminderToDisplay;
reminderToDisplay = [self.reminders objectAtIndex:indexPath.section];
Следующие несколько строк должны быть знакомы, мы создаем ячейку и метки.Затем мы используем объект напоминания для установки текста меток.
Причина, по которой ваше существующее решение не работало, заключалась в том, что вы использовали indexPath.Row, а также потому, что вы используете раздел для каждого напоминания indexPath.Row.всегда будет 0, так как в каждом разделе у вас будет только 1 строка.
Я знаю, что это длинный пост, но, надеюсь, должен помочь вам понять, что происходит.Любые вопросы, то дайте мне знать