我(iPhone新手)正在开发一款跟踪数据使用情况(wifi,手机)的iPhone应用程序。我给了用户一个选项来添加新的计划,这些计划将被放入数据库(sqlite)的表中。 我在选择器视图中显示计划列表,并且我想在用户输入新计划后立即刷新选择器视图中的数据。截至目前,pickerview正在下次运行中更新:( 提前致谢。 代码在这里:
actionSheet = [[UIActionSheet alloc] initWithTitle:nil delegate:nil cancelButtonTitle:nil destructiveButtonTitle:nil otherButtonTitles:nil];
[actionSheet setActionSheetStyle:UIActionSheetStyleBlackTranslucent];
CGRect pickerFrame = CGRectMake(0, 40, 0, 0);
pickerView = [[UIPickerView alloc] initWithFrame:pickerFrame];
pickerView.showsSelectionIndicator = YES;
pickerView.dataSource = self;
pickerView.delegate = self;
[actionSheet addSubview:pickerView];
plans= [[NSMutableArray alloc] init];
NSLog(@"Data base is entering");
NSString *path1 = [[NSBundle mainBundle] pathForResource:@"antara" ofType:@"sqlite"];
FMDatabase *db1 = [[FMDatabase alloc] initWithPath:path1];
[db1 open];
FMResultSet *fResult2= [db1 executeQuery:@"SELECT * FROM main"];
NSLog(@"fresult2 ready");
while ( [fResult2 next])
{
planData = [fResult2 stringForColumn:@"planName"];
[plans addObject:planData];
NSLog(@"The data is =%@",planData);
}
[db1 close];
[pickerView selectRow:1 inComponent:0 animated:NO];
//mlabel.text= [plans objectAtIndex:[pickerView selectedRowInComponent:0]];
//[self setCurrentPlan:[plans objectAtIndex:[pickerView selectedRowInComponent:0]]];
//[mlabel setText:[self getCurrentPlan]];
currentPlan= [plans objectAtIndex:[pickerView selectedRowInComponent:0]];
[plan setText:currentPlan];
[pickerView release];
答案 0 :(得分:1)
我认为你的代码需要一些分离。试试这个并告诉我它是否有效
1)取出将数据从DB拉入单独函数的逻辑,让我们称之为loadPlans。
- (void) loadPlans {
plans= [[NSMutableArray alloc] init];
NSLog(@"Data base is entering");
NSString *path1 = [[NSBundle mainBundle] pathForResource:@"antara" ofType:@"sqlite"];
FMDatabase *db1 = [[FMDatabase alloc] initWithPath:path1];
[db1 open];
FMResultSet *fResult2= [db1 executeQuery:@"SELECT * FROM main"];
NSLog(@"fresult2 ready");
while ( [fResult2 next])
{
planData = [fResult2 stringForColumn:@"planName"];
[plans addObject:planData];
NSLog(@"The data is =%@",planData);
}
[db1 close];
}
2)显然,这段代码来自你上面粘贴的函数,因此,从该函数中删除这些行。
3)在正常流程下:在调用上述函数之前调用loadPlans
4)每当您在数据库中插入内容时。再次调用这两个函数
[self loadPlans];
[PickerView reloadComponent:n];
这一切都假定计划的db条目发生在同一页面和同一个线程中,以便您可以控制它,您可以在其中调用这些函数。如果这个假设不正确,那么还要解释如何以及何时将计划添加到db中,在此处粘贴一些关于db entry的代码。
答案 1 :(得分:0)
您需要做的就是通过
触发重建正在显示的组件[customPickerView reloadComponent:n] // where n = the index of the component
在加载完成后将触发器代码放到某处。
你也可以使用这样的东西来检查pickerView是否可见,以及你是否真的需要更新屏幕:
if ([screenUpdateDelegate respondsToSelector:@selector(whateverIneedToDo:)]) {
[screenUpdateDelegate whateverIneedToDo:withParameterIfYouLike];