将值传递给与 uiview 关联的 class 并让 draw 识别值而不是默认的 class 值
Passing values to the class associated with a uiview and having draw recognize the values instead of the default class values
看看我能不能解释一下...
- 有一个 ViewController 为两个 UIView 定义了出口以显示图表。
- UIView 有 class 通过身份检查器的 "Custom Class" Class 属性 附加到它们。
- 每个 class 都有一个重写 "draw" 来绘制图表,它在启动时会这样做。
- 要绘制的项目(矩形)的某些值使用 class 定义为具有默认值的 var 的变量
- 在控制器中,我将变量设置为新值,但是当 draw 方法被调用时(通过控制器中的 outletName.setNeedsDisplay()),它使用 class 的默认值有。
问题。如何将新值传递到 UIView 的 UIView subclass 中,以便绘制不会每次都呈现相同的东西? "simple" 我错过了什么?
其他说明
- 先让 currentContext = UIGraphicsGetCurrentContext() 就好了
次,无后续次数
- 我在视图控制器中设置标签值并在绘图中更改它
方法和控件具有新值
- draw 方法中的打印语句全部打印到控制台
时间
谢谢
也许图片有帮助?始终使用“5”
ViewController.swift
...@IBOutlet var graphView: UIView! // linked to GraphController.swift in Identity Inspector
...var graphController = GraphController() // UIView
...buttonClick
......graphContoller.xCoord = 20
......graphController.yCoord = 20
......graphView.setNeedsDisplay()
GraphController.swift
...var xCoord: Int = 5
...var yCoord: Int = 5
...override func draw(_ rect: CGRect) {
......let rect = CGRect(x: xCoord, y: yCoord, width: 10, height: 10) <- simplified for example
在我看来,您的 var graphController
是您创建的对象,与您的视图层次结构无关。它抽象地存在,永远不会显示在屏幕上。
如果 graphView
是链接到 IB 中定义的 GraphController
class 实例的插座,那么您应该在 graphView
上设置属性,并且应该完全摆脱 var graphController
。
编辑:
要将评论中的信息收集到答案中:
您对自定义视图 class 的工作方式感到困惑。您没有 "a class associated with a UIView." 您创建了 UIView 的自定义子 class。您的自定义 subclass 是一个 UIView,但它有您添加的额外代码 and/or 属性。
您没有设置视图和管理该视图的控制器对象。 (视图控制器是它管理的所有视图的控制器对象。)您创建自定义视图的实例。 (对于像 table 视图这样的复杂对象,创建一个与您的视图对象协同工作的控制器对象 (UITableViewController) 可能是有意义的,但这是不寻常的,除非您清楚地了解什么,否则您不应该这样做你在做什么,为什么。)
以下是创建 UIView 的自定义子 class 的步骤:
1) 为自定义 class 创建一个新文件,例如MyView.swift:
class MyView: UIView {
//Your custom properties and and methods go here.
}
2) 在故事板中,将一个新的通用 UIView
对象拖到表单上。 Select 身份检查器并将视图的 class 更改为自定义子 class(在我的示例中为 MyView)。这告诉 IB(Interface Builder)"When you create a view here, create my custom subclass instead of a generic view." 请注意,由于您在步骤 1 中定义了自定义子class,IB 应该为您自动完成 class 名称。
这就像将汽车对象拖到屏幕上,然后选择汽车对象并将其类型从 "car" 切换为 "Prius"。普锐斯是一辆汽车,但它是一种特殊的汽车,具有其他汽车所没有的一些属性。
3) 按住 Control 从您的新自定义视图(本例中为 MyView 对象)拖动到您的视图控制器的源文件中并创建一个插座。由于您在第 2 步中更改了视图类型,Xcode 将使用您的自定义类型设置插座。由于它是正确的类型,您可以 read/write 属性或调用插座上的方法,编译器会让您。
看看我能不能解释一下...
- 有一个 ViewController 为两个 UIView 定义了出口以显示图表。
- UIView 有 class 通过身份检查器的 "Custom Class" Class 属性 附加到它们。
- 每个 class 都有一个重写 "draw" 来绘制图表,它在启动时会这样做。
- 要绘制的项目(矩形)的某些值使用 class 定义为具有默认值的 var 的变量
- 在控制器中,我将变量设置为新值,但是当 draw 方法被调用时(通过控制器中的 outletName.setNeedsDisplay()),它使用 class 的默认值有。
问题。如何将新值传递到 UIView 的 UIView subclass 中,以便绘制不会每次都呈现相同的东西? "simple" 我错过了什么?
其他说明
- 先让 currentContext = UIGraphicsGetCurrentContext() 就好了 次,无后续次数
- 我在视图控制器中设置标签值并在绘图中更改它 方法和控件具有新值
- draw 方法中的打印语句全部打印到控制台 时间
谢谢
也许图片有帮助?始终使用“5”
ViewController.swift
...@IBOutlet var graphView: UIView! // linked to GraphController.swift in Identity Inspector
...var graphController = GraphController() // UIView
...buttonClick
......graphContoller.xCoord = 20
......graphController.yCoord = 20
......graphView.setNeedsDisplay()
GraphController.swift
...var xCoord: Int = 5
...var yCoord: Int = 5
...override func draw(_ rect: CGRect) {
......let rect = CGRect(x: xCoord, y: yCoord, width: 10, height: 10) <- simplified for example
在我看来,您的 var graphController
是您创建的对象,与您的视图层次结构无关。它抽象地存在,永远不会显示在屏幕上。
如果 graphView
是链接到 IB 中定义的 GraphController
class 实例的插座,那么您应该在 graphView
上设置属性,并且应该完全摆脱 var graphController
。
编辑:
要将评论中的信息收集到答案中:
您对自定义视图 class 的工作方式感到困惑。您没有 "a class associated with a UIView." 您创建了 UIView 的自定义子 class。您的自定义 subclass 是一个 UIView,但它有您添加的额外代码 and/or 属性。
您没有设置视图和管理该视图的控制器对象。 (视图控制器是它管理的所有视图的控制器对象。)您创建自定义视图的实例。 (对于像 table 视图这样的复杂对象,创建一个与您的视图对象协同工作的控制器对象 (UITableViewController) 可能是有意义的,但这是不寻常的,除非您清楚地了解什么,否则您不应该这样做你在做什么,为什么。)
以下是创建 UIView 的自定义子 class 的步骤:
1) 为自定义 class 创建一个新文件,例如MyView.swift:
class MyView: UIView {
//Your custom properties and and methods go here.
}
2) 在故事板中,将一个新的通用 UIView
对象拖到表单上。 Select 身份检查器并将视图的 class 更改为自定义子 class(在我的示例中为 MyView)。这告诉 IB(Interface Builder)"When you create a view here, create my custom subclass instead of a generic view." 请注意,由于您在步骤 1 中定义了自定义子class,IB 应该为您自动完成 class 名称。
这就像将汽车对象拖到屏幕上,然后选择汽车对象并将其类型从 "car" 切换为 "Prius"。普锐斯是一辆汽车,但它是一种特殊的汽车,具有其他汽车所没有的一些属性。
3) 按住 Control 从您的新自定义视图(本例中为 MyView 对象)拖动到您的视图控制器的源文件中并创建一个插座。由于您在第 2 步中更改了视图类型,Xcode 将使用您的自定义类型设置插座。由于它是正确的类型,您可以 read/write 属性或调用插座上的方法,编译器会让您。