未调用 UIViews SetNeedsDisplay

UIViews SetNeedsDisplay not called

新手警告! :) 我的应用程序中有多个视图,所有视图都在故事板中设置,并且都有自己的 subclassed UIView classes 以及自己覆盖的 drawRect 方法。其中一个用作按钮,能够通过 setneedsdisplay 重绘自身并调用另一个 UIViews 的函数 class:

import UIKit

class Button: UIView {
override func touchesEnded(touches: NSSet, withEvent event: UIEvent) {
    super.touchesEnded(touches, withEvent: event)
    let touchPoint: CGPoint! = touches.anyObject()?.locationInView(self)
    if butouched == true{
        if touchPoint.x > bounds.size.width - bounds.size.height && touchPoint.x < bounds.size.width && touchPoint.y > 0 && touchPoint.y < bounds.size.height{
            counter++
            setNeedsDisplay()  //thats the setNeedsDisplay that works
            DrawGraph().updateModell()
        }
    }
}

现在的问题是此函数中的 setNeedsDisplay 不起作用,即使调用了 updateModell 函数:

import UIKit

class DrawGraph: UIView {
func updateModell() {
    setNeedsDisplay() // thats the setNeedsDisplay that doesn't work
} 

所以我用谷歌搜索了又用谷歌搜索,但就是无法弄清楚哪里出了问题。是的,这是我与 Swift 和 iOS...

的第一周

这是你给 updateModell 的电话:

DrawGraph().updateModell()

此行创建 DrawGraph 新实例 并向其发送 updateModell 消息。 DrawGraph 的这个新实例不在您的视图层次结构中。它独立于 DrawGraph 的任何其他实例。由于没有任何内容引用 DrawGraph 的这个新实例,因此在 updateModell returns 之后立即删除该实例。你现在明白为什么对 updateModell 的调用对屏幕没有影响了吗?

我不知道您为什么决定尝试实现自己的 Button class。您有什么理由不喜欢 UIButton

实现这个的正常方法是将 counter 属性 放在您的视图控制器中(或在您的视图控制器引用的模型对象中)。视图控制器还引用了按钮和现有的 DrawGraph。将按钮的“Touches Ended”事件连接到视图控制器中的 IBAction 方法。在 IBAction 方法中,更新计数器,更新按钮的标签(或其他),并将 updateModell 发送到 DrawGraph.

的现有实例

在 Storyboard 上的 View 和 DrawGraph 之间创建一个 outlet,假设你将它命名为 DrawGraphV,确保视图是 Custom class DrawGraph,你不需要 updateModell 方法,直接调用即可 DrawGraphV.SetNeedsDisplay