UITableView正在添加空行并禁用滚动

时间:2014-11-12 21:31:22

标签: ios objective-c uitableview

利用从this answer填充UITableView的方法,并通过以下方式将表设置为编辑模式:

tableView.editing = true;

并添加以下方法:

- (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath
{
    return YES;
}

- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath
{

}

我看到用户可能会意外(或故意)双重标签订购句柄并插入一个空行。这也会导致表格视图的滚动。这是一张图片:

iosbug

" Logs"和"设置"有一个空行。我通过the answers found here遍历了表格视图中的所有行,并且跳过空行,好像它们不存在一样。

每次移动一行时,我都可以通过[tableView reload] 删除空行,但不幸的是,这会导致一种震动。但是,我还没有能够重新启用滚动功能。我试图避免让用户关闭并重新显示视图。

任何人遇到这个问题并找到合适的解决方法吗?

修改

行删除无关 - 这是因为移动行

而发生的

这是ios 8/7上的Xcode 6.1 - 也见过这个Xcode 5.x - > ios 7/8。 我们的目标是ipads,所以不确定这是否是iphone的问题

此外,更好地描述了如何重现:

  • 双击单元格,然后按住第二次点击
  • 向上或向下拖动单元格

Posted on Apple forums并向Apple提交了错误。这是我提交给他们的示例项目(我能够重现上述问题):

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.tableData = [NSMutableArray arrayWithObjects:@"One",@"Two",@"Three",@"Four",@"Five",
                        @"One",@"Two",@"Three",@"Four",@"Five",
                        @"One",@"Two",@"Three",@"Four",@"Five",
                        @"One",@"Two",@"Three",@"Four",@"Five",
                        @"One",@"Two",@"Three",@"Four",@"Five",
                        @"One",@"Two",@"Three",@"Four",@"Five", nil];
    self.tableView.editing = true;
    [self.tableView setTableFooterView:[UIView new]];
    self.tableView.separatorStyle = UITableViewCellSeparatorStyleSingleLine;
    self.tableView.rowHeight = 20.0;

}

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return [self.tableData count];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *cellIdentifier = @"ScrollingDisplayCell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];

    if( cell == nil )
    {
        cell = [[[UITableViewCellNoPadding alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier] autorelease];   // MEMCHK: Autorelease so no ownership implications

        cell.textLabel.font = [UIFont fontWithName:@"Courier New" size:17.0];
        cell.textLabel.frame = cell.contentView.bounds;
    }
    // Configure the cell...
    cell.textLabel.text = [self.tableData objectAtIndex:indexPath.row];

    return cell;
}

- (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath
{
    return YES;
}

- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath
{
    NSString *stringToMove = self.tableData[sourceIndexPath.row];
    [self.tableData removeObjectAtIndex:sourceIndexPath.row];
    [self.tableData insertObject:stringToMove atIndex:destinationIndexPath.row];
}

这是UITableViewCellNoPadding:UITableViewCell:

// https://stackoverflow.com/questions/3467288/center-align-text-in-uitableviewcell-problem
-(void)layoutSubviews
{
    [super layoutSubviews];
    self.textLabel.frame = CGRectMake(0, self.textLabel.frame.origin.y, self.frame.size.width, self.textLabel.frame.size.height);
}

注意:在这里复制比在我自己的应用程序中更难

1 个答案:

答案 0 :(得分:0)

由于您指定用户无法删除行,因此我添加了editingStyleForRowAtIndexPath以始终返回UITableViewCellEditingStyleNone。如果没有此实现,默认情况下会返回UITableViewCellEditingStyleDelete

通过下面发布的实现,一切似乎表现都很好,我已经检查过所有编辑都成功提交到表模型。

我希望这有帮助!

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

    self.tableModel = [NSMutableArray new];
    for (int i = 0; i < 30; i++) {
        [self addTableObject];
    }

    _tableView.delegate = self;
    _tableView.dataSource = self;
    _tableView.editing = true;

}

- (void) addTableObject
{
    NSString *rowValue = [NSString stringWithFormat:@"%i", _tableModel.count+1];
    [_tableModel addObject:rowValue];
}

#pragma mark - Table view delegate methods

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

    UITableViewCell *cell = (UITableViewCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (!cell) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1
                                      reuseIdentifier:CellIdentifier];
    }

    cell.textLabel.text = [_tableModel objectAtIndex:indexPath.row];

    return cell;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    return _tableModel.count;
}

- (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath
{
    return YES;
}

- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath
{
    //Make change in data model
    id selectedValue = [_tableModel objectAtIndex:sourceIndexPath.row];
    [_tableModel removeObjectAtIndex:sourceIndexPath.row];
    [_tableModel insertObject:selectedValue atIndex:destinationIndexPath.row];
}

- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath
{
    return UITableViewCellEditingStyleNone;
}