如何在rubymotion中的tableView中为单元格添加另一个textlabel和按钮?

时间:2013-03-06 13:22:55

标签: rubymotion

我使用以下方法创建一个单元格并在其中填充数据(改编自推文应用示例) 现在我想添加一个显示所选事件日期的新标签和一个将执行另一个操作的按钮。 这里有两种方法:

def self.cellForEvent(event, inTableView:tableView)
    cell = tableView.dequeueReusableCellWithIdentifier(EventCell::CellId) || EventCell.alloc.initWithStyle(UITableViewCellStyleDefault, reuseIdentifier:CellId)
    cell.fillWithEvent(event, inTableView:tableView)
    cell.accessoryType =  UITableViewCellAccessoryDetailDisclosureButton
    cell
end

将数据填充到单元格中

def fillWithEvent(event, inTableView:tableView)
    self.textLabel.text = event.name
    puts event.image
    unless event.image
      self.imageView.image = nil
      Dispatch::Queue.concurrent.async do
        event_image_data = NSData.alloc.initWithContentsOfURL(NSURL.URLWithString(event.image_url))
        if event_image_data
          event.image = UIImage.alloc.initWithData(event_image_data)
          Dispatch::Queue.main.sync do
            self.imageView.image = event.image
            tableView.delegate.reloadRowForEvent(event)
          end
        end
      end
    else
      self.imageView.image = event.image
    end
  end

1 个答案:

答案 0 :(得分:0)

railsdog的建议并非毫无根据。您可以对要编辑的单元格进行@reference,并在以后对其进行更改。但这有点危险 - 很多陷阱:细胞移出屏幕会发生什么?在别处重复使用?棘手。

相反,我建议将一些fillWithEvent:inTableView代码添加到cellForEvent方法中,这样您就可以调用tableView.reloadRowsAtIndexPaths:withRowAnimation:并调用该方法。这将我上面提到的复杂性移到了Cocoa框架的背面,这是一个好东西: - )

缺点是您需要保持indexPath方便(或可计算),并始终牢记与单元格关联的event是暂时的,因为单元格被重用。上面的代码似乎没有引用event,这是一件好事!

# in fetchImageForEvent:tableView:
# ...
event.image = UIImage.alloc.initWithData(event_image_data)
Dispatch::Queue.main.sync do
  # instead of this:
  # self.imageView.image = event.image

  # tell the tableView to reload.  unfortunately, we don't have the index
  # path.  not sure how you're calculating it, but if you've got a list of
  # events, this should be easy.
  # I'm just assuming section 0, row 1 here.
  path = NSIndexPath.indexPathWithIndex(0).indexPathByAddingIndex(1)
  tableView.reloadRowsAtIndexPaths([path], withRowAnimation:UITableViewRowAnimationAutomatic)
end