xcode,在退出的seque上重新加载表视图

时间:2012-12-25 13:06:10

标签: xcode tableview segue

我正在尝试在退出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;
}

2 个答案:

答案 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