【问题标题】:Titanium TableViewRow classname with custom rows具有自定义行的 Titanium TableViewRow 类名
【发布时间】:2012-06-13 17:37:16
【问题描述】:

我想知道 Ti.UI.TableViewRow 的“className”属性在创建自定义行时有何帮助。

例如,我通过以下方式使用自定义行填充表格视图:

function populateTableView(tableView, data) {
  var rows = [];
  var row;
  var title, image;
  var i;

  for (i = 0; i < data.length; i++) {
    title = Ti.UI.createLabel({
      text : data[i].title,
      width : 100,
      height: 30,
      top: 5,
      left: 25
    });
    image = Ti.UI.createImage({
      image : 'some_image.png',
      width: 30,
      height: 30,
      top: 5,
      left: 5
    });

    /* and, like, 5+ more views or whatever */

    row = Ti.UI.createTableViewRow();

    row.add(titleLabel);
    row.add(image);

    rows.push(row);
  }

  tableView.setData(rows);
}

当然,使用 TableViewRow 的标准 titleimage 属性可以轻松创建此“自定义”行示例,但这不是重点。如何防止分配新标签、图像视图和表格视图的其他子视图以支持它们的重用?我知道在 iOS 中,这是通过使用方法 -[UITableView dequeueReusableCellWithIdentifier:] 从当前未用于显示数据但已经具有所需的子视图在其中正确布局,因此只需要更新其中包含的数据(文本、图像数据等)。

由于这个系统非常简单,我很难相信 Titanium API 使用的方法不支持这个。

通读 API 并搜索网络后,我确实怀疑是这种情况。推荐使用“className”属性作为在 Titanium 中提高表格视图效率的简单方法,但未以任何方式解释其与自定义表格视图行的关系。如果有人能为我澄清这件事,我将不胜感激。

【问题讨论】:

    标签: titanium tableview allocation classname


    【解决方案1】:

    Titanium SDK 使用-[UITableView dequeueReusableCellWithIdentifier:] 来重用单元格布局。在 UITableView 代理(Titanium SDK 2.1.3)中,你有这个:

    TiUITableView.m(第 1720 行)

    - (UITableViewCell *)tableView:(UITableView *)ourTableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        ...
        UITableViewCell *cell = [ourTableView dequeueReusableCellWithIdentifier:row.tableClass];
        ...
    }
    

    此代码用于重用布局单元格。您可以在 Apple 文档中查看有关此方法 here 的更多信息。

    【讨论】:

    • 感谢您向我指出这一点,但我在哪里可以找到与调用的 javascript 函数的连接?就像与row = Ti.UI.createTableViewRow(); 的连接或设置className 时一样(顺便说一下,我在这段代码中没有这样做,但我可能应该......)
    • 嗯,有联系。当您使用Ti.UI.createTableViewRow() 创建 UITableViewRow 时,会设置属性 tableClass 并且 UITableView 委托使用它来重用单元格。
    • 我看到你看到了,但我看不到我们如何从 javascript 方法 Ti.UI.createTableViewRow() 到 Objective-C 方法 -tableView:cellForRowAtIndexPath:。我现在理解的方式是:每次您将TiUITableViewRowadd() 创建到TiUITableView 代理对象时,“系统”都会以某种方式记住这一点,以确保多次调用ObjC 方法-tableView:cellForRowAtIndexPath:使用正确的参数确保UITableview 对象在显示之前获得正确的UITableViewRow
    • cellForRowAtIndexPath 是一个 TableView 委托,从 iOS 自动调用。它不需要被调用。它在构造 UITableViewRow 以显示给用户时调用。回答你的问题?
    • 哦,对,我知道;),当然!答案接受:)。但还有一件事:[TiUITableViewRowProxy clearTableRowCell:cell]; 清除了单元格(我在 TiUITableViewRowProxy.m 中进行了检查。对我来说,这似乎与人们想要发生的完全相反,不是吗? ?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-15
    • 1970-01-01
    • 2018-03-31
    • 1970-01-01
    • 1970-01-01
    • 2012-10-16
    • 1970-01-01
    相关资源
    最近更新 更多