ios - 将值传递给与 uiview 关联的类并让 draw 识别值而不是默认类值

标签 ios swift xcode8

看看我能不能解释一下...

  • 有一个 ViewController,它具有为两个 UIView 定义的导出以显示图表。
  • UIView 具有通过身份检查器的“自定义类”类属性附加到它们的类。
  • 每个类都有一个重写“draw”来绘制图表,它在启动时会这样做。
  • 要绘制的项目(矩形)的某些值使用定义为具有默认值的 var 的类变量
  • 在 Controller 中,我将变量设置为新值,但是当 draw 方法被调用时(通过 Controller 中的 outletName.setNeedsDisplay()),它使用类的默认值。

问题。如何将新值传递到 UIView 的 UIView 子类中,以便绘制不会每次都呈现相同的东西?我缺少什么“简单”的东西?

其他注意事项

  • 首先让 currentContext = UIGraphicsGetCurrentContext() 没问题 时间,无后续时间
  • 我在 View Controller 中设置标签值并在绘图中更改它 方法和控件有新的值(value)
  • 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 是您创建的一个对象,与您的 View 层次结构无关。它抽象地存在,永远不会显示在屏幕上。

如果 graphView 是链接到 IB 中定义的 GraphController 类实例的导出,那么您应该在 graphView 上设置属性,并且应该完全摆脱 var graphController

编辑:

将评论中的信息收集到答案中:

您对自定义 View 类的工作方式感到困惑。您没有“与 UIView 关联的类”。您创建 UIView 的自定义子类。您的自定义子类是一个 UIView,但它有您添加的额外代码和/或属性。

您无需设置 View 和管理该 View 的 Controller 对象。 ( View Controller 是它管理的所有 View 的 Controller 对象。)您创建自定义 View 的实例。 (对于像 TableView 这样的复杂对象,创建一个与 View 对象协同工作的 Controller 对象 (UITableViewController) 可能是有意义的,但这是不寻常的,除非你清楚地了解你在做什么,否则你不应该这样做为什么。)

以下是创建 UIView 的自定义子类的步骤:

1) 为自定义类创建一个新文件,例如我的 View .swift:

class MyView: UIView {
  //Your custom properties and and methods go here.
}

2) 在您的 Storyboard中,将一个新的通用 UIView 对象拖到窗体上。选择身份检查器并将 View 的类更改为您的自定义子类(在我的示例中为 MyView)。这告诉 IB(Interface Builder)“当你在这里创建一个 View 时,创建我的自定义子类而不是通用 View 。”请注意,由于您在第 1 步中定义了自定义子类,IB 应该为您自动完成类名。

这就像将汽车对象拖到屏幕上,然后选择汽车对象并将其类型从“汽车”切换为“普锐斯”。 Prius 是一辆汽车,但它是一种特殊的汽车,具有其他汽车所没有的某些属性。

3) 按住 Control 从您的新自定义 View (本例中为 MyView 对象)拖动到您的 View Controller 的源文件中并创建一个 socket 。由于您在第 2 步中更改了 View 类型,Xcode 将使用您的自定义类型设置 socket 。由于它是正确的类型,您可以读取/写入属性或调用 socket 上的方法,编译器会让您这样做。

关于ios - 将值传递给与 uiview 关联的类并让 draw 识别值而不是默认类值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43436948/

相关文章:

ios - 给图像添加参数;上传API如 "userid"= "50"

ios - UINavigationController:使用 SWRevealViewController 错误:对开始/结束外观转换的调用不平衡

ios - CGContext 错误仅在模拟器中?

ios - Swift 协议(protocol)未设置标签值且为零

swift - 从 NSTextView 获取格式化字符串

ios - Phonegap 构建命令后 Cordova 插件未传输到 iOS

IOS 图表 Y 轴未正确对齐 - 图表 Cocoa Pod

ios - Chromecast 在 iOS 上的实现

ios - 使用其他三个 View Controller 设置 UITabBarController

ios - 检测 iOS 键盘上的 Shift + Enter