在 UITableView 中添加多个自定义单元格

2024-01-06

虽然这是最常被问到的问题之一,但我找不到一个全面的答案。我需要在 UITableView 中有自定义单元格。有些包含标签或文本字段,有些包含图像和按钮。我为每种类型的细胞制作了单独的类。我正在使用包含多个部分的 GroupStyle 表。现在,我在 cellForIndexPath 中添加单元格,并使用 switch-case 表示部分,使用 if-else 表示部分中的行:

id cell;
switch(indexPath.section) {
    case 0:
           if(indexPath.row==0) {
               CellA *cell = [[[CellA alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:[NSString stringWithFormat:@"Celld%",indexPath.row]] autorelease];
               //configure cell
               return cell;
           }
           else if(indexPath.row==1) {
               CellB *cell = [[[CellB alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:[NSString stringWithFormat:@"Celld%",indexPath.row]] autorelease];
               //configure cell
               return cell;
           }
           break;
    case 1:
           if(indexPath.row==0) {
               CellC *cell = [[[CellC alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:[NSString stringWithFormat:@"Celld%",indexPath.row]] autorelease];
               //configure cell
               return cell;
           }
           break;
    default:
            break;
}
return cell;

我还必须在最后返回单元格,因为由于代码块内单元格的定义,单元格变得无法识别。为了解决这个问题,我在顶部声明了带有 id 的单元格。但我知道这不是正确的方法。如何解决多种类型单元格的声明和访问问题?

目前有 4-5 行适合一个屏幕并且不需要滚动。所以,我不会重复使用细胞。但编辑时会挤入更多行。在另一个表中,有更多的行可以滚动屏幕。这意味着我必须重复使用细胞。所以,我的问题的第二部分是;如何重用多个自定义单元格?


要回答你的第一个问题,你不妨返回nil因为你没有什么好的回报价值。如果遇到这种情况,就会抛出异常;就像现在一样,它可能会在框架代码内的某个位置给你一个 EXC_BAD_ACCESS 。

回答你的第二个问题,每个type单元格应该有一个唯一的reuseIdentifier。例如,所有 CellA 都可以具有@“CellA”的重用标识符。然后,您将完全重复使用它们,就像在所有单元格都相同的情况下一样:当您需要 CellA 调用时[tableView dequeueReusableCellWithIdentifier:@"CellA"], 当您需要 CellB 呼叫时[tableView dequeueReusableCellWithIdentifier:@"CellB"], 等等。例如,

    case 0:
        if (indexPath.row == 0) {
            CellA *cell = [tableView dequeueReusableCellWithIdentifier:@"CellA"];
            if (!cell) {
                cell = [[[CellA alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"CellA"] autorelease];
            }
            // configure cell
            return cell;
        }
        else if (indexPath.row == 1) {
            CellB *cell = [tableView dequeueReusableCellWithIdentifier:@"CellB"];
            if (!cell) {
                cell = [[[CellB alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"CellB"] autorelease];
            }
            // configure cell
            return cell;
        }
        break;
    case 1:
        if (indexPath.row == 0) {
            CellC *cell = [tableView dequeueReusableCellWithIdentifier:@"CellC"];
            if (!cell) {
                cell = [[[CellC alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"CellC"] autorelease];
            }
            // configure cell
            return cell;
        }
        break;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 UITableView 中添加多个自定义单元格 的相关文章

随机推荐

  • R 中从右到左的语言支持(使用 Mac)

    我想知道在使用 Mac 时是否有支持 R 中从右到左语言的方法 例如假设以下代码 x lt data frame a runif 10 b runif 10 ggplot x aes a b geom point xlab 结果如下 在这里
  • 绑定到静态类实例中的属性

    我想要实现的目标 我有一个 WPF 应用程序 仅用于测试 我想将标签的文本 内容 绑定到某处的属性 这个想法是 当用户选择不同的语言时 该属性值将会改变 当属性更改时 我希望标签文本更新为新值 我尝试过的 我尝试创建一个具有标签值静态属性的
  • 检查 Internet Explorer 中的伪元素

    我有以下伪元素 input type radio selected before 在互联网浏览器中 伪元素根本不显示 所以我决定看一下 我在检查器中找到了选择器 检查器中的选择器将是一本很棒的儿童读物 但是所有属性都被删除了 即覆盖 无效
  • webpack 构建中意外的令牌“导出”

    我收到的错误是 webpack 无法将导出识别为关键字 我已经更新了 babelrc 并安装了必要的依赖项 我确信这与不理解 es6 有关 但我找不到解决我的问题的解决方案 以下是查看我的依赖项 错误和重要文件所需的文件 index scs
  • Google Go 语言中哪些类型是可变的和不可变的?

    在 Google Go 中 我读到字符串是不可变的 好吧 但是是 int 吗 那么其他类型呢 作为一个稍老的程序员 我更喜欢可变性 尽管我知道不变性的好处 但我更喜欢危险地生活 了解哪些类型是可变的或不可变的将非常有帮助 更新 我最关心的是
  • tools/bazel.rc 如何与外部工作区依赖项一起使用?

    如果我将外部 Bazel 项目作为 WORKSPACE 依赖项拉入 并且该项目有一个 tools bazel rc 添加了一些默认构建选项并定义了一些构建 config 选项 那么它到底是如何工作的 构建这些外部构建目标时是否使用这些默认选
  • 如何显示 Cabal 项目的依赖关系树

    我在用cabal v2 build构建一个项目 但它在我不直接依赖的包上不断失败 有没有办法与cabal列出包的所有依赖项 最好以树格式 这样我就可以看到我所依赖的调用构建失败的内容并 希望 摆脱它 Try cabal plan https
  • 如何保存 HTML5 画布?

    目前我正在使用画布2图像 http www nihilogic dk labs canvas2image 保存 HTML5 画布的内容 然而 它似乎不适用于 Google Chrome 欢迎任何有关如何解决该问题的想法 canvas toD
  • 我可以使用委托的单个实例来启动多个异步请求吗?

    只是想知道是否有人可以澄清使用BeginInvoke当您想要进行多个异步调用时 在某个委托的实例上 因为 MSDN 文档根本没有真正涵盖 提及这一点 我想做的是类似以下的事情 MyDelegate d new MyDelegate this
  • 我的表需要更多标准化吗?

    我正在制作一个简单的公共现金簿数据库表来计算我和我的朋友一起吃饭花了多少钱 我的第一个表只是一个表 它有一个具有非原子值的 person 列 所以我将表分成两个表 如上所示 但我不确定这是否足够正常化 是否存在任何应该规范化的功能依赖性 但
  • Google 数据源 JSON 无效吗?

    我正在使用他们的Google数据源来实现Python库 http code google com apis visualization documentation dev gviz api lib html tojsonexample 我希
  • Android 2.3 的 ActionBarCompat 中没有 FEATURE_INDETERMINATE_PROGRESS -

    我在用着 requestWindowFeature Window FEATURE INDETERMINATE PROGRESS setSupportProgressBarIndeterminateVisibility true setSup
  • regsvr32 是否有 .NET 或 Win32 版本?

    regsvr32 是否有 NET 或 Win32 版本 我想用代码注册一个 COM DLL 而不是使用 regsvr32 程序 注册程序集的标准方法是调用导出的DllRegisterServer装配体上的功能 http msdn micro
  • 如何以编程方式重新加载 Visual Studio Code 窗口?

    用户可以通过编辑器的 命令面板 运行 重新加载窗口 来实现此目的 然而 从扩展创作的角度来看 这并不像立即提示用户那么简单 期望的结果是将当前的实施this https github com xabikos vscode javascrip
  • 从 NSOperationQueue 取消 NSOperation 导致崩溃

    我正在尝试构建一个下载管理器类 它将所有异步下载 每个操作都有自己的线程 操作打包到 NSOperation 子类中 以便稍后将它们添加到 NSOperationQueue 中 下载管理器类 单例 还公开了一些方法来处理队列并取消符合某些要
  • 在本地文件夹中安装 gem

    我在使用的共享计算机上的权限有限 因此无法按照习惯的方式安装 gem 例如 gem install request log analyzer ERROR While executing gem Gem FilePermissionError
  • 组合的自定义过滤器

    我正在使用 Webix 用户界面 它允许定义组合控件 如下所示 webix ui view combo options One Two Three 它工作得很好 除了一瞬间 默认情况下 组合按文本统计过滤数据 输入 o 后 组合列表将仅显示
  • 如何将不同的类封装在一个类中并保持其独特的方法? (delphi中的多重继承?)

    我目前正在重写一个免费的教育数字电路模拟器 以为其功能添加惯性 我的问题是如何将事件分派到原始类 并向它们添加预先阐述 我有这样的事情 TC1 class ID integer Connections array integer of Pi
  • 向服务器发送数据时 Websocket 与 REST

    背景 我们正在编写一个类似 Messenger 的应用程序 我们已将 Websockets 设置为收件箱和聊天 Question 我的问题很简单 什么时候有什么优点和缺点从客户端向服务器发送数据使用 REST 而不是 Websocket 我
  • 在 UITableView 中添加多个自定义单元格

    虽然这是最常被问到的问题之一 但我找不到一个全面的答案 我需要在 UITableView 中有自定义单元格 有些包含标签或文本字段 有些包含图像和按钮 我为每种类型的细胞制作了单独的类 我正在使用包含多个部分的 GroupStyle 表 现