未调用 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
新手警告! :) 我的应用程序中有多个视图,所有视图都在故事板中设置,并且都有自己的 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