【问题标题】:xcode, reloading table view on exiting sequexcode,在退出序列时重新加载表视图
【发布时间】:2012-12-11 10:33:23
【问题描述】:

我正在尝试在退出序列后重新加载表格视图的值。该过程是:我从配置文件选择视图手动执行序列,添加一个新的配置文件名称,返回到配置文件选择视图。然后我想重新加载表格视图添加新的配置文件名称。它运行代码正常(与进入场景的原始代码相同),但我似乎无法获得 numberOfRowsInSectionnumberOfRowsInSection 来重新填充表格视图。实际上,在新的配置文件名称更新之前,我必须离开屏幕并重新输入它。有什么想法吗?


//** 手动执行序列

-(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;
}

【问题讨论】:

    标签: xcode tableview segue


    【解决方案1】:

    你有几个不同的选择:

    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 或不使用情节提要,那么您可以创建一个协议,其中包含一个在添加新配置文件时应调用的方法,并且您可以在调用该方法时重新加载数据.这里有很多关于 SO 的问题,涵盖了如何执行此操作(例如 dismissModalViewController AND pass data back,它显示了如何传递数据,但您可以做同样的事情来调用一个方法)。

    【讨论】:

    • 这是完美的,谢谢。您的链接也很有帮助,因为我在导航密集型应用程序中使用了很多 segue。我一直在寻找一种优雅的方式来避免新视图的不断实例化,而是有一个“家庭”视图作为后续的中心点。
    • 刚刚有机会再次进入我的电脑后面。根据调试器,此方法在退出 segue 时不会被命中。 -(void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; [自加载用户]; [self.userTableView reloadData]; }
    • 当我第一次打开视图时它进入,但没有退出segue。
    • 真的吗?它应该是。你把它放在原始视图控制器中,而不是在添加配置文件控制器中,对吧?
    • 我花了一点时间才弄明白,但这是因为您使用的是UIModalTransitionStylePartialCurlmodalTransitionStyle。我猜他们不会调用它,因为它并没有完全离开屏幕。如果您使用不同的样式(如默认样式),那么它将调用viewWillAppear。如果您想坚持下去,那么您可能应该使用其他方法之一。
    【解决方案2】:

    这是上面 cmets 中 lnafzinger 的实际答案。再次感谢。

    - (void)viewWillAppear:(BOOL)animated
    {
        [super viewWillAppear:animated];
        [self.tableView reloadData];
    }
    

    我花了一点时间才弄明白,但这是因为你正在使用 UIModalTransitionStylePartialCurl modalTransitionStyle。我猜 他们没有调用它,因为它并没有完全离开屏幕。如果 您使用不同的样式(如默认样式)然后它将调用 视图将出现。如果你想坚持下去,那么你应该 可能使用其他方法之一。 – lnafziger

    【讨论】:

    • 顺便说一句,由于这在技术上不是答案,因此您应该编辑原始问题并在那里添加代码,而不是将其放入答案中。大多数人不会看答案来了解更多这样的细节。
    • UIModalTransitionStyleFlipHorizo​​ntalUIModalTransitionStyleCrossDissolve 工作正常。其他的我都没试过。
    • 欢迎来到永无止境的问题-(void)viewWillAppear:(BOOL)animated works fine 然而。你不能从它启动另一个segue,你需要使用-(void)viewDidAppear:(BOOL)animated我猜旧的segue还没有完全完成?
    • 实际上,segue 不是原始问题的一部分。如果你对此有疑问,你可以问另一个问题! :) 另外,如果你想让我得到帮助你的分数,既然我给了你答案,你需要接受我的答案而不是你的......
    • 对不起,你刚才提到的另一篇文章中提到了segue,我应该删除:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-21
    • 1970-01-01
    • 2015-08-29
    • 2017-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多