IOS - UITableView被冻结

时间:2015-04-13 13:42:17

标签: ios objective-c uitableview

我目前遇到问题时遇到了困难。

我在里面创建了一个包含2个容器的视图是一个UITableView,另一个显示了考虑第一个选择的信息。

除非我滑动删除(实际上我没有尝试删除行,但只是为了重置对象中包含的信息 - 一个图像列表) - 并在左侧容器上刷新视图以显示重置已完成。

此时该过程会删除必须删除的内容以及所有内容(同时刷新用户界面),但有时在此事件之后我无法再选择列表中的任何对象,就好像表格是不再启用用户交互(我尝试使用断点时不再接收事件)。但视图的其余部分仍然有效(我仍然可以点击右侧容器的按钮等)。此外,如果我点击我的按钮打开相机,当我回来时,视图再次正常工作。有什么方法可以让我的刷新以某种方式卡住?

Xcode没有给我任何停止,所以程序继续工作。

我真的不知道要显示什么代码(我没有提供所有代码,但我认为所有代码都很重要):

@implementation PJTableViewController
{
    NSIndexPath *selectedRow;
    NSMutableArray *tableData;
}

@synthesize attachmentShow, attachments, listPJ;

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view from its nib.

    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(reloadTableView)
                                                 name:@"reloadLeftContainer"
                                               object:nil];

    selectedRow = [NSIndexPath indexPathForRow:0 inSection:0];

    if( attachments != nil )
    {
        tableData = attachments.mutableCopy;
    }

    [listPJ setScrollEnabled:YES];
}

-(void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
    [self selectCurrentRow];
}

// Selection
-(void) selectCurrentRow
{
    NSIndexPath *indexPath = selectedRow;
    [listPJ selectRowAtIndexPath:indexPath animated:NO scrollPosition:UITableViewScrollPositionNone];
    [self tableView:listPJ didSelectRowAtIndexPath:indexPath];
}

//Reload
-(void) reloadTableView
{
    [listPJ performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:NO];
    [self selectCurrentRow];
}

-(void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    selectedRow = [tableView indexPathForSelectedRow];

    NSDictionary *dictionary = tableData[indexPath.section];
    Attachment *att = (Attachment*)[dictionary objectForKey:[dictionary allKeys][0]][indexPath.row];
    if( att )
        [attachmentShow setAttachment:att];
}

-(BOOL) tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSDictionary *dictionary = tableData[indexPath.section];
    Attachment *att = (Attachment*)[dictionary objectForKey:[dictionary allKeys][0]][indexPath.row];
    if( att.attachmentsPath.count == 0)
        return NO;
    return YES;
}

-(void) tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
    NSDictionary *dictionary = tableData[indexPath.section];
    Attachment *att = (Attachment*)[dictionary objectForKey:[dictionary allKeys][0]][indexPath.row];

    // Reset Attachment
    if( att.attachmentsPath.count > 0)
    {
        [att resetAttachment];
        [attachmentShow setAttachment:att];
        [self reloadTableView];
    }
}

[att resetAttachment];此行允许我重置附件内容。 [attachmentShow setAttachment:att];这一行允许我使用新信息将更新设置为正确的容器。

1 个答案:

答案 0 :(得分:2)

使用-reloadRowsAtIndexPaths:withRowAnimation:。当您更新特定内容时,切勿重新加载整个tableView。