如何根据在选取器视图中选择的行组件更新表视图数据
Posted
技术标签:
【中文标题】如何根据在选取器视图中选择的行组件更新表视图数据【英文标题】:How to update table view data based on row component selected in picker view 【发布时间】:2012-01-02 07:26:04 【问题描述】:我有一个应用程序,我需要将提醒保存在一个页面中,并在其他页面中显示保存的提醒。我已经使用 sqlite3 成功完成了!
在查看提醒页面中,用户将有 3 个选项来查看,查看我已经实现的所有选项,查看包含 4 个组提醒的组。因为它们只是 4 个组,我为 4 个创建了 4 个视图控制器独特的组。只需使用以下完美的查询:
NSString *sqlQuery = [NSString stringWithFormat:@"select * from reminders WHERE grp = 'Friends'"];
但我在查看月度页面时遇到问题,该页面在选择器视图中包含 12 个行组件供用户选择,即一年中的所有 12 个月:
我找到了检索特定月份中所有提醒的查询,比如 12 月,我使用以下查询检索:
NSString *sqlQuery = [NSString stringWithFormat:@"select * from reminders WHERE Date BETWEEN '2012-12-01' AND '2012-12-31'"];
在进入查看每月页面(控制器)之前,有一个月份选择器视图,正如我之前提到的,我知道我们可以有单独的视图控制器页面来显示 12 个月的数据,就像我在查看组提醒,但代码变得忙碌。因此我希望表格视图根据选择器视图(行组件)中选择的月份自动更新。
我发现了一个类似的问题,但这个问题没有答案!
Update table view data based on row component selected in picker view
我尝试为显示数据的视图控制器创建一个存在选择器视图的类控制器实例:
ERViewEditController *viewEditController;
在检索时我使用了以下代码:
if(viewEditController.monthPicker selectedRowInComponent:0)
sqlQuery = [NSString stringWithFormat:@"select * from reminders WHERE Date BETWEEN '2012-01-01' AND '2012-01-31'"];
sql_stmt = [sqlQuery UTF8String];
else if(viewEditController.monthPicker selectedRowInComponent:1)
sqlQuery = [NSString stringWithFormat:@"select * from reminders WHERE Date BETWEEN '2012-02-01' AND '2012-02-31'"];
sql_stmt = [sqlQuery UTF8String];
等...等所有月份,然后使用以下代码进行显示:
if (sqlite3_prepare_v2(self.remindersDB, sql_stmt, -1, &statament, NULL) == SQLITE_OK)
while (sqlite3_step(statament) == SQLITE_ROW)
ReminderClass *remin = [[ReminderClass alloc]init];
remin.Name = [[[NSString alloc]initWithUTF8String:(const char *)sqlite3_column_text(statament, 1)]autorelease];
remin.Event = [[[NSString alloc]initWithUTF8String:(const char *)sqlite3_column_text(statament, 2)]autorelease];
remin.Date = [[[NSString alloc]initWithUTF8String:(const char *)sqlite3_column_text(statament, 3)]autorelease];
NSDateFormatter *dateFormat = [[NSDateFormatter alloc]init];
[dateFormat setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
NSDate *date = [dateFormat dateFromString:remin.Date];
[dateFormat setDateFormat:@"MMMM dd"];
NSString *dateVal = [dateFormat stringFromDate:date];
remin.Date = dateVal;
[self.monthArray addObject:remin];
[remin release];
sqlite3_finalize(statament);
现在什么都没有显示:(
我如何才能达到要求,请任何人帮助我提出您的宝贵建议!
提前谢谢大家:)
【问题讨论】:
【参考方案1】:你应该调用 reloadData 方法。
如果在 .h 文件中你有一个 TableView 对象
UITableView *table;
那么当你想更新你的表时你应该写,
[table reloadData];
【讨论】:
是的,我知道如何重新加载表的数据。但我的要求是:我有一个 12 个月的选择器视图。现在当我选择一行时,它将导航到一个视图显示与该月对应的提醒的控制器。但是我不能有 12 个视图控制器来显示 12 个相应月份的提醒。所以我希望表格视图能够根据所选月份自动更新。那么有什么方法可以将选取器视图行组件与表格视图数据链接起来。 ..请在这方面帮助我。请再次查看问题...感谢您的回答和关注:)【参考方案2】:选择 PickerView 所在行
保存成字符串
将此字符串访问到新的视图控制器中,您的 UITableView 委托方法在其中实现
cell.textLabel.text = str
;其中 str 是您在 pickerView 上选择的字符串
在new View Controller的一个方法中,访问字符串的地方,写一行代码[table reloadData];
【讨论】:
感谢您的回答,将实施并回复您!【参考方案3】:通过在行插入调试点来调试您的代码。
[self.monthArray addObject:remin];
那么,您应该编写以下代码以确保您的数组为空或具有所需的值。
for(int i=0;i<[self.monthArray count];i++)
NSLog("Array ids :%@",[self.monthArray ObjectAtIndex:i])
如果它在控制台中打印正确的值,那么您应该在委托方法 cellForRowAtIndex 中编写以下行。
cell.textLabel.text = [self.monthArray objectAtIndex:indexPath.row];
【讨论】:
感谢您的回答,它在控制台中显示为:Array ids:我在这个链接中找到了答案:
Get selected value of a picker view that is present in different view and use the string in some other view
谢谢大家:)
【讨论】:
以上是关于如何根据在选取器视图中选择的行组件更新表视图数据的主要内容,如果未能解决你的问题,请参考以下文章