当前位置: 首页 > 知识库问答 >
问题:

使用“插入的”行初始化UITableView

秋阳荣
2023-03-14

我有一个UITableView,我想在其中插入和删除行。

如果我有一个包含 10 个值的数组,并且从包含所有行的表视图开始,则表显示正常。然后,如果我想过滤掉除[0,1,5]之外的所有内容。然后,我完成删除索引路径处的行的过程:[2,3,4,6,7,8,9],返回的行数为3。我不必更改我的单元格呈现代码,它显示行:[0,1,5]。

但是,如果在过滤完所有内容后,我想返回到这个表,并从persistence中加载包含行[0,1,5]的表,我就有麻烦了。该表加载行数:3,并呈现单元格:[0,1,2]。

我尝试用0行初始化viewDidLoad中的表,然后在viewDid众目睽睽中调用插入行:[0,1,5]-但这会引发异常:

*** Assertion failure in -[UITableView _endCellAnimationsWithContext:], /SourceCache/UIKit_Sim/UIKit-2380.17/UITableView.m:909

而且我已经验证了在viewDidLoad中,打印的行数是0,而就在抛出这个错误之前,打印的行数是3。

如果我改为插入[0,1,2]则进行编辑-这有效...但是再一次...我最终需要[0,1,5]出现。

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

    NSArray *initializing_indeces = @[[NSIndexPath indexPathForRow:0 inSection:0], [NSIndexPath indexPathForRow:1 inSection:0], [NSIndexPath indexPathForRow:5 inSection:0]];
    [self.userDataTable insertRowsAtIndexPaths:initializing_indeces withRowAnimation:UITableViewRowAnimationAutomatic];
}
- (int) tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    // Using different booleans, but the gist:
    if (viewDidLoad)
        return 0;
    if (viewDidAppear || filtered)
        return 3;
    if (expanded)
        return 10;
}
- (UITableViewCell*) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"CELL"];

    if (!cell) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"CELL"];
    }


    [cell.textLabel setText:[NSString stringWithFormat:@"%i",indexPath.row]];

    return cell;
}

共有3个答案

越风史
2023-03-14

首先,在您的案例中numberOfRowsInSectionreturnNSInteger

我不知道什么是重生。我假设该问题必须连接到代码中的此部分,

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section

通常,您在这些数据源方法之一中犯了错误。也许不可能说出到底出了什么问题,但它可能是这样的:你正在告诉表格视图的编号的行数(在你的例子中是10),而在单元格中,你只处理10 - 1行。如果您向我们展示您的数据源的实现,则告诉发生了什么会容易得多。

傅兴平
2023-03-14

@鱼stix

[单元格文本标签集文本:[NS字符串使用格式:@“%i”,索引路径.row]];

代码中的这个方法清楚地表明,文本将是带有indexPath的NSString。行的值。现在,当您删除行和数据源时,从10=[0,1,5][2,3,4,6,7,8,9]3=[0、1,5]。您的数据源已减少为计数为3的数组。因此,您将只获得三行作为返回的bbynumberOfRowsInSection方法。这三行将具有这些indexPath。行的0、1、2。因此,您得到的是0,1,2,而不是0,1,5

如果在< code > cellforrowatdinexpath 方法中打印indexPath(过滤后),您将看到它们分别为[0,0] [0,1] [0,2],表示第0节和第0、1、2行。因此你的结果

如在得到你想要的结果。这样做。采取属性@property(保留,非原子)NS阵列*数据阵列;

在viewDidLoad:self中。dataArray=[NSArray阵列WithObjects:@“0”,@“1”,@”2“,@”3“,@“4”,@(5),@(6),@”7“,@(8),@“9”,nil];

在numberOfRowsInSection中返回[array count];

在cellForRow中[cell.textLabel setText:[self.dataArray objectAtIndex:indexPath.row]];

现在只需在viewWillAppear或任何你想要的地方将dataSource(我指的是dataArray)更改为过滤或扩展状态,并使用[self.tableView reloadData]重新加载表数据;

希望我是清楚的。干杯,玩得开心。

墨阳羽
2023-03-14

我必须自己跟踪地图:

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

    if (!cell) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"CELL"];
    }


    int row = indexPath.row;
    if (filtered) {
        // Translate 0 - 0
        // Translate 1 - 1
        // Translate 2 - 5
    }

    [cell.textLabel setText:[NSString stringWithFormat:@"%i", row]];

    return cell;
}

我最后使用了一个NSMutableArray,过滤后它变成了[0,1,5],所以访问这个数组的索引indexPath.row of 2返回5。

 类似资料:
  • 问题内容: 当我测试新插件时,不断抛出异常:java.lang.IllegalArgumentException:插件已初始化!请帮忙!这是代码: 我知道您只应该为每个插件声明一个JavaPlugin类,我认为我正在这样做。但它一直在说: 我真的需要测试此插件,看看它是否有效,任何帮助将不胜感激!谢谢! 问题答案: stacktrace清楚地指出了问题出在哪里。什么是堆栈跟踪,如何使用它来调试应用

  • 问题内容: 我有一些已经在使用的JBoss webapp,还有一个懒惰的初始化问题。因此,建议我在Spring进行调查并使用。 但是,我仍然会收到错误消息,希望您能对我有所帮助?要使用Spring OEM过滤器,我还需要在应用程序中进行哪些更改? 我的设置是这样的: + jsf的东西。 我将其设置如下:web.xml applicationContext.xml: persistence.xml:

  • 我正在尝试设置Application子类中的默认FirebaseApp: 看起来一切正常,但当我想将一些事件记录到FirebaseAnalytics时,我会得到这个错误:缺少Google_App_ID。已禁用Firebase分析。我不知道问题出在哪里。

  • 我有一个受控输入,它接受名为的道具。该对象由其父组件传递给它,并在其中用观察者1异步初始化。 在父组件中: 我想用填充受控输入的初始状态。类似下面的内容,这不应该是反模式,因为状态只依赖于构造上的prop。 当我刷新受控输入时,出现以下问题: 的值为,因为观察者尚未触发。组件被构造并将分配给. 观察者激发,为用户分配一个复杂的对象,React重新呈现组件。这不会更改组件的状态,仍然是。 我被困在如

  • 考虑以下代码: 以下是一些引用的标准 拷贝初始化 从cppreference复制引用的初始化 如果object是lvalue表达式,其类型是T或从T派生的,且具有相等或较少CV限定性,则该引用绑定到由lvalue标识的对象或其基类子对象。 如果object是lvalue表达式,其类型隐式转换为T或从T派生的类型,具有相等或较少CV限定性,则考虑源类型及其基类返回lvalue引用的非显式转换函数,并

  • 你已经有了基本的页面布局和需要用的CSS以及JS文件。现在我们需要初始化我们的应用,比如在 my-app.js中 var myApp = new Framework7(); 上面这个例子中我们使用了 myApp 作为变量名存储 Framework7 初始化之后的实例。 这样初始化非常简单,但是Framework7 也提供了更多个性化的定制,只需要在初始化的时候传入一个配置对象即可。 var myA