我正在尝试在退出seque后重新加载表视图的值。过程是:我从配置文件选择视图手动执行seque,添加新的配置文件名称,返回到配置文件选择视图。然后我想重新加载表视图添加新的配置文件名称。它运行代码很好(与原始条目相同的代码进入场景),但我似乎无法获得 numberOfRowsInSection 和 numberOfRowsInSection 重新填充表格视图。实际上我必须离开屏幕并重新输入它,然后新的配置文件名称将更新。有什么想法吗?
// **手动执行seque
-(IBAction)buttonAddNewProfile:(id)sender
{
// creating object for profile selection screen
UIStoryboard *ProfileSelectionStoryboard=[UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
// creating object for add new profile storyboard
AddNewProfileViewController *addnewprofileVC=[ProfileSelectionStoryboard instantiateViewControllerWithIdentifier:@"Add New Profile"];
// setting the transition style
addnewprofileVC.modalTransitionStyle=UIModalTransitionStylePartialCurl;
// performing the segue
[self presentViewController:addnewprofileVC animated:YES completion:nil];
// performing new table view load on return from new profile
[self loadUsers];
}
// **用于加载新配置文件名称的函数。
-(void)loadUsers
{
// retreiving the users from the database
SQLiteFunctions *sql = [[SQLiteFunctions alloc] init];
// testing for successful open
if([sql openDatabase:@"users"])
{
// setting query statement
const char *query = "SELECT * FROM users;";
// testing for that profile name existing already
if([sql getUserRecords:query] > 0)
{
// initializing array
NSMutableArray *names = [[NSMutableArray alloc] init];
// loop through object compling an array of user names
for(Users *ProfileUser in sql.returnData)
{
// adding user name to the listview array
[names addObject:ProfileUser.user_name];
}
// setting table view array to local array
tableData = names;
}
}
}
// **重新加载表视图的方法
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section;
{
// returning the number of rows in the table
return [tableData count];
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;
{
// setting up the table view cells for data population
UITableViewCell *cell = nil;
cell = [tableView dequeueReusableCellWithIdentifier:@"MyCell"];
// testing for cell parameters
if (cell == nil)
{
// setting up cloned cell parameters
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"MyCell"];
}
// setting cell values to the array row value
cell.textLabel.text = [tableData objectAtIndex:indexPath.row];
// returning the current row label value
return cell;
}
答案 0 :(得分:3)
这里有几个不同的选项:
1)最简单的方法是每次视图控制器即将显示其视图时重新加载表:
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
[self.tableView reloadData];
}
不利的一面是,即使您不一定需要重新加载数据,这也会在显示视图的每个时间内执行
。2)如果您使用的是故事板并且目标是iOS 6+,那么当您从添加配置文件视图控制器返回时,您可以使用展开segue在视图控制器上调用特定方法。有关详细信息,请参阅此SO问题/答案:Does anyone know what the new Exit icon is used for when editing storyboards using Xcode 4.5?
3)如果您的目标是旧版本的iOS或没有使用故事板,那么您可以使用一种方法创建一个协议,只要添加新的配置文件就应该调用该方法,并且只要调用该方法就可以重新加载数据。这里有很多关于如何执行此操作的问题(如dismissModalViewController AND pass data back,其中显示了如何传递数据,但您可以执行相同的操作来调用方法)。
答案 1 :(得分:0)
这是lnafzinger在上述评论中的实际答案。再次感谢。
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
[self.tableView reloadData];
}
我花了一些时间来解决这个问题,但这是因为你正在使用它 UIModalTransitionStylePartialCurl modalTransitionStyle。我猜 他们没有打电话,因为它没有完全离开屏幕。如果 你使用不同的风格(如默认)然后它会调用 viewWillAppear中。如果你想坚持下去,那么你应该 可能使用其他方法之一。 - lnafziger