如何使用alertview刷新uitableivew?

时间:2014-03-31 06:50:53

标签: ios objective-c uitableview

在.h文件中:

@property (weak, nonatomic) IBOutlet UITableView *tableView;

在.m文件中:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *simpleTableIdentifier = @"RememberedTableListCell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];

    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:simpleTableIdentifier];
    }

    cell.textLabel.text = [[listItems objectAtIndex:indexPath.row] objectForKey:@"word"];
    return cell;
}

- (IBAction)resetList:(UIBarButtonItem *)sender {

    UIAlertView *resetAlert = [[UIAlertView alloc] initWithTitle:@"Reset" message:@"Are you sure to reset the list?" delegate:self cancelButtonTitle:@"No" otherButtonTitles:@"Yes", nil];
    [resetAlert show];

}

- (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex {

    // the user clicked Yes
    if (buttonIndex == 1) {
        // reset the list

        //reload table data
        NSLog(@"button yes is clicked");

        for (NSMutableDictionary*l in listAll) {
             [l setValue:@"0" forKey:@"remembered"];
        }

        [self.tableView reloadData];
        //[[NSOperationQueue mainQueue]addOperationWithBlock:^{[self.tvRemembered reloadData];}];

        //[self.tableView reloadRowsAtIndexPaths:[self.tableView indexPathsForSelectedRows] withRowAnimation:UITableViewRowAnimationNone];


        NSLog(@"refreshing...");


    }

}

如何使用 UIAlertView代表刷新 UITableView ?我已按上述方式尝试reloadData:reloadRowsAtIndexPaths:。但他们没有帮助。任何帮助将不胜感激。

4 个答案:

答案 0 :(得分:2)

有些时候reloadData无法正常工作,因此您需要reloadData延迟时间,例如,

- (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex {

    // the user clicked Yes
    if (buttonIndex == 1) {
        [self performSelector:@selector(reloadTableData) withObject:self afterDelay:0.20]; // set afterDelay as per your requirement.
    }
}

方法

-(void)reloadTableData
{
    [self.tableView reloadData];
}

了解更多信息

https://developer.apple.com/library/ios/documentation/uikit/reference/UITableView_Class/Reference/Reference.html#//apple_ref/occ/instm/UITableView/reloadData

答案 1 :(得分:2)

您应该只更新数据源并调用reloadData

 (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex {

    // the user clicked Yes
    if (buttonIndex == 1) 
    {
        // TODO : Update your data source (most likely array) here.   

        NSLog(@"refreshing...");
        [self.tableView reloadData];
    }
}

希望它有所帮助!

修改

我对您的更新有两条评论:

  1. 您正在使用listItems填充cell.textLabel.text并使用了objectForKey word。尝试更新word集合中密钥listItems的值。因此,您的单元格事件将使用新值。

  2. 避免为UITableView使用相同的名称tableView,因为其名称由其事件使用。我个人要么注意使用self方法,要么使用不同的名称来避免警告类似的实例名称。

答案 2 :(得分:1)

来自Apple Docs不应在插入或删除行的方法中调用它,尤其是在通过调用beginUpdates和endUpdates实现的动画块中

您必须仅使用reloaddata,而不是beginUpdates

- (void)alertView:(UIAlertView *)alertView didDismissWithButtonIndex:(NSInteger)buttonIndex {

    // the user clicked Yes
    if (buttonIndex == 1) {

        [self.tableView reloadData];

    }

}

答案 3 :(得分:0)

一次尝试这么多东西不起作用。

如果您有适当的代表和& tableview的数据源不仅仅是:[self.tableView reloadData];

会奏效。