【问题标题】:Handling multiple timer values in a UITableViewController?在 UITableViewController 中处理多个计时器值?
【发布时间】:2017-02-18 03:42:17
【问题描述】:

我不一定需要代码,但我会很感激关于如何处理我的问题的非常具体的步骤/逻辑。

我的初始视图控制器是一个表格视图控制器。它将显示单个计时器值并在当前单元格中显示其倒计时。计时器值是从单独的常规视图控制器中检索的。这个视图控制器包含一个 UIPicker 并且计时器值是使用用户从选择器中选择的值来计算的。

我在处理 tableviewcontroller 中的多个计时器的逻辑时遇到问题。应该为每个新创建的单元分配一个新的计时器对象,该对象是随着该单元的创建而创建的。这样,特定单元格使用使用特定 UIPicker 值创建的时间值。到目前为止,我只能将它带到每个单元格使用与创建的第一个单元格相同的计时器值的位置。

如何告诉位于初始表视图控制器中的新创建单元格,它应该只使用由用户选择的特定计时器值创建的值,而 UIPicker 位于第二个视图控制器中?如何分隔单元格之间的计时器值?

【问题讨论】:

    标签: ios uitableview timer swift3 tableviewcell


    【解决方案1】:

    你永远不应该有一个带有逻辑实现的表格视图单元格,所以单元格的接口最多应该有一个名为 setTime 的方法,你给它一个 String 它只是将它分配给标签。

    既然已经澄清了,那么应该由谁来做逻辑呢?我相信您可以将计时器逻辑抽象到它们自己的对象中,因为表格视图控制器要跟踪所有播放/暂停状态、已经过去了多少时间等太麻烦了。

    所以表视图控制器剩下的工作就是从计时器对象中获取数据(剩余时间),将它们转换为Strings(您可能在这里有 VC 应该处理的格式化逻辑)然后传递这些字符串到单元格。

    代码如下所示:

    var timerObject = timerObjectArray[rowNumber]
    var timeRemaining: Date = timerObject.getTimeRemaining()
    var timeString: String = convertToString(timeRemaining)
    cell.setTimeString(timeString)
    

    所以现在我们尝试弄清楚何时/如何获得细胞。 至于什么时候,那将是你的选择,我认为NSTimer.scheduledTimerWithInterval 可以工作(注意保留周期)

    现在,在您传递给每个周期运行的计划的方法中,您应该有这样的代码:

    self.tableView.beginUpdates()
    var visibleCells = self.tableView.visibleCells
    for cell in visibleCells {
        var indexPath = self.tableView.indexPath(for: cell)
        var rowNumber = indexPath.row
    
        var timeRemainString = getTimeRemainingStringFor(row: rowNumber)
        cell.setTimeString(timeRemainString)
    }
    self.tableView.endUpdates()
    

    希望这有帮助!我可能错过了什么,所以请询问

    【讨论】:

    • getTimeRemainingStringFor() 方法是什么样的?
    • 它就像第一个代码块一样,它是一个实例方法,给定rowNumber,找到相应的计时器对象并返回一个时间字符串。
    • 所以在我每个周期(每秒)运行的方法中,当我将单元格文本设置为 rowNumber 时,每个单元格的文本都是正确的。第一个单元格的文本是第 1 行或类似的内容,第二个单元格的文本是第 2 行等。那么如何将第一个单元格的文本设置为位于数组索引 0 处的字符串,设置第二个单元格的文本单元格到字符串数组的索引 1 处的字符串,依此类推。像这样:cell.textLabel.text = string inside of array at element 0,然后当为数组中的元素 1 输入字符串时,第二个单元格文本就是该特定字符串。
    • 我们应该从哪里调用计时器方法,即 NSTimer.scheduledTimerWithInterval ?来自 cellForRowAt() 方法还是来自其他地方?
    • @JeffWoo 您能否发布更多代码,或者您能否解释一下 tableview.beginupdates 和 end updates 如何与正常的 tableview 函数(例如 cellforrowatindexpath)交互?他们互动吗?还是你把它放在那里?
    【解决方案2】:

    我认为您的问题是维护每行数据的状态。由于表格视图重用了单元格,因此它成为一个问题。 将计时器的状态保存在父视图控制器的数组中。 在每次调用 cellForRowAtIndex 时设置该值。

    【讨论】:

      【解决方案3】:

      请使用下面代替 NSTimer。

      解决方案:1

      int64_t delayInSeconds = gameInterval; // Your Game Interval as mentioned above by you
      
      dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC);
      
      dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
      
          // Update your label here. 
      
      });
      

      解决方案:2

      NSTimer.scheduledTimerWithTimeInterval(1, 
                          target: NSBlockOperation(block: {...}), 
                          selector: #selector(NSOperation.main), 
                          userInfo: nil, 
                          repeats: true)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-09-12
        • 1970-01-01
        • 2014-02-09
        • 1970-01-01
        • 1970-01-01
        • 2020-07-24
        • 2015-02-20
        • 2021-12-21
        相关资源
        最近更新 更多