【问题标题】:UITableView with Editable Cell Graphics带有可编辑单元格图形的 UITableView
【发布时间】:2015-07-21 03:20:57
【问题描述】:

我正在使用 xCode 7 Beta / Swift。我在情节提要的UIViewController 内创建了一个UITableView。我有一个实现UITableViewDelegateUITableViewDataSource 协议的控制器。

在故事板中,只有一个原型单元格。它只有一个子视图,UIScrollView。在控制器中,我需要将图像添加到此滚动视图。根据单元格的不同,需要添加的图像数量是可变的。我还需要在滚动视图之外的单元格中添加一个按钮。按下此按钮后,我需要在滚动视图中添加或删除图像,并将按钮更改为不同的按钮。

目前,我正在func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 中实现所有这些功能。按下按钮后,我为按下按钮的行调用self.tableView.reloadRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.None)。我在func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 内部有一个巨大的if-else,它检查它是因为刚刚按下按钮而被调用,还是因为需要生成新单元格而被调用。

这不起作用。一个单元格似乎不记得它之前添加的子视图。

两个问题:

  1. 编辑表格视图单元的 UI 的最佳方法是什么? 单击该单元格中的按钮?
  2. 我应该如何在我的 tableView 中布局原始(在按下任何按钮之前)单元格 信息只能在控制器中访问?

【问题讨论】:

    标签: ios xcode swift uitableview


    【解决方案1】:

    如果您在 UITableView 中重复使用单元格,则不会在屏幕上保存对单元格的任何更改。它们将被擦除,并且一旦您再次滚动过去,该单元格将重新加载为“默认”。如果您想知道我所说的“重用”是什么意思,我指的是使用以下选择器来获取单元格:

    -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        UITableViewCell *cell = [self.tableView dequeueReusableCellWithIdentifier:@"myCell" forIndexPath:indexPath];
        // Configure Cell 
        return cell;
    }
    

    选择器dequeueReusableCellWithIdentifier 表示它将重用或回收单元格以节省内存。

    在 UITableViewCell 中有一大堆图像和按钮是一个问题。为了解决您的问题,我不建议禁用 dequeue 方法,而是创建一个数组或对象类型来保存单元格信息。

    这将允许您在单元格不存在时存储信息,然后使用 tableView 行索引获取它,并将其显示在单元格中。

    【讨论】:

    • 当你说“默认”时,你到底是什么意思?什么是默认值?布置默认单元格的代码在哪里?我之所以问,是因为当我向下滚动并向上滚动(从而重新加载它们)时,第一次加载 tableview 时第一个屏幕上的单元格与那些相同的单元格不同。
    • 默认单元格是修改前的单元格。如果我使用标准 UITableViewCell 并且不对其进行子类化,它将是一个大约 30px 高的空白单元格。我相信默认单元格有一个 UIImageView 和 UILabel 。你是如何创造你的细胞的?你要对它们进行子类化吗?
    【解决方案2】:

    感谢您的帮助。我可以通过从按钮的目标函数中更新单元格 UI 来解决这个问题:

    let buttonPosition = sender.convertPoint(CGPointZero, toView: self.tableView)
    if let indexPath = self.tableView.indexPathForRowAtPoint(buttonPosition) {
    
        self.eventsUserJoined[indexPath.row] = false
        let cell = tableView.cellForRowAtIndexPath(indexPath) as! NewsFeedCell
    }
    

    然后我使用这个对单元格的引用来更新它的子视图。我还存储了一个全局指标 (self.eventsUserJoined) 变量,以确保单元格在必须重绘时正确播放。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-16
      • 1970-01-01
      • 1970-01-01
      • 2011-09-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多