【问题标题】:Best way to update UIView whenever new data is available每当有新数据可用时更新 UIView 的最佳方式
【发布时间】:2018-08-21 16:35:24
【问题描述】:

我有一个UIView,我想在有新数据可用时更新它。这里有一些上下文:我有一个数据结构,只要用户点击“开始”按钮,它就会不断实时更新。数据结构随着时间的推移接收矢量数据,每隔几秒就会添加新的矢量数据。我试图将矢量数据绘制到UIView 上的方式是使用 CGPoints。我希望能够调用一个函数,给这个函数一组CGPoints,然后在UIView上画线,因为新数据被添加到数据结构中。最好的方法是什么?

这是我目前所拥有的,但没有一条线在 UIVIew 上绘制:

class VectorDraw: UIView {

  var origin: CGPoint = .zero
  var point2: CGPoint = .zero


  override func draw(_ rect: CGRect) {

      //Declaring context and its properties (i.e its width and color)
      let context = UIGraphicsGetCurrentContext()
      context?.setLineWidth(3.0)
      context?.setStrokeColor(UIColor.purple.cgColor)

      //Context directions, what to do with the context a move - addLine = stroke
      context?.move(to: origin)
      context?.addLine(to: point2)

      //Actually draws line
      context?.strokePath()
      print("Line drawn from origin at x: ", origin.x, "\tat y: ", origin.y)
      print("To terminal point at x: ", point2.x, "\tat y: ", point2.y)
  }
}

我的想法是在点击开始按钮时更改 CGPoints,然后调用 vectorDraw.setNeedsLayout(),但 UIView 不会更新。唯一出现的行是当我在应用打开时将CGPoints 设置为不同的坐标。

【问题讨论】:

  • 我按照你说的做了,但还是画不出来。覆盖绘制函数中有打印语句,这些语句甚至没有打印到控制台。这告诉我这个函数根本没有被调用。
  • @Daniel Lyon 我将您告诉我的内容复制到了我的 viewDidLoad 中,但没有看到任何新情况发生。我不确定这是否会有所帮助,但这里有一些关于我的应用程序的更多信息。它从 iphone 的传感器组件生成向量。生成新的 CGPoints 后,我更改 vectorDraw.originvectorDraw.point2。在下一行的同一个函数中,我做了你在上一条评论中对我提出的要求。我输入了vectorDraw.setNeedsLayout(),然后输入了vectorDraw.layoutIfNeeded()。当那不起作用时,我只尝试了vectorDraw.setNeedsDisplay()。仍然没有任何效果
  • 我有一个计时器函数,但在viewDidAppearviewDidLoad. 中都没有调用它我有一个调用startTimer()stopTimer() 函数的IBAction 函数。跨度>
  • 抱歉,我没有正确阅读。我确实将它移到了ViewDidAppear,但这仍然不起作用。
  • 那也没用。可能是什么问题?您是否需要其他任何其他信息来帮助我解决这个问题?

标签: ios swift uiview cgpoint


【解决方案1】:

其他东西正在向VectorDraw 提供坐标,而您希望VectorDraw 在每次坐标供应商更新时重绘?您必须将新坐标重新提供给VectorDraw,然后在VectorDraw 上调用setNeedsDisplay() 函数以重新渲染视图

【讨论】:

  • 我已经尝试过了,但是在我的代码中的任何地方调用 setNeedsDisplay() 都不会重绘视图。
【解决方案2】:

所以我想通了。我遇到的问题是我没有更新实际视图,而是我用于绘制线的类视图的实例。

下面是代码示例:我有一个变量var vectorDraw = VectorDraw(),我试图像vectorDraw.setNeedsDisplay() 那样更新视图。问题在于这不是实际视图。它只是 VectorDraw 的一个对象变量。我找到的解决方案(通过查看此示例得到:https://github.com/fujianjin6471/DemosForBlog/tree/master/SetNeedsDisplay)是您需要将主情节提要的实际视图连接到 ViewController,但不知何故我完全错过了。如果你从你的视图控制拖拽到你的 ViewController 你会得到一个像@IBOutlet var vectorDrawView: VectorDraw! 这样的变量。这是您需要调用setNeedsDisplay() 的变量,您的视图将会更新!

【讨论】:

  • 这是正确的!你学到了重要的一课。然而,同样的问题已经在这里回答了很多次了(我知道,因为我自己已经回答过很多次了)。创建一个新对象而不是获取对现有对象的引用是初学者常见的错误。此外,您没有在原始问题中显示关键代码,因此没有人可能知道您在做什么。所以这个问题和答案并没有真正为 site 添加任何新内容。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-13
  • 2010-11-22
相关资源
最近更新 更多