是否可以使用 swift 在 UIViewController 和 UIView 之间传递数据?
Posted
技术标签:
【中文标题】是否可以使用 swift 在 UIViewController 和 UIView 之间传递数据?【英文标题】:Is it possible to pass data between the UIViewController and UIView using swift? 【发布时间】:2016-12-29 20:28:23 【问题描述】:是否可以在 UIViewController 和 UIView 之间传递数据? 如果是,怎么做?
例如,当您按下 button1 时,UIViewController 会告诉 UIView 该人按下了 button1,然后 UIView 会绘制一个三角形。但是,如果您随后按下 button2,UIViewController 会告诉 UIView 他现在按下了 button2,然后 UIView 会消除三角形并绘制一个圆圈。
按钮以编程方式构建。
问题是如何在 UIViewController 的 UIView 中调用我用 drawRect 绘制的形状。
class ViewController: UIViewController
@IBOutlet var UnitViewTabeller: UnitView!
var btn: UIButton!
override viewDidLoad
self.btn = UIButton(frame: CGRectMake(0.04 * view.bounds.width, 0.91 * view.bounds.height, 0.44 * view.bounds.width, 0.07 * view.bounds.height)) //set frame
self.btn.layer.cornerRadius = 10
self.btn.setTitle("0", forState: .Normal) //set button title
self.btn.setTitleColor(UIColor.whiteColor(), forState: .Normal) //set button title color
self.btn.backgroundColor = UIColor(red: 0.2745, green: 0.2784, blue: 0.2706, alpha: 1.0) //set button background color
self.btn.tag = 0 // set button tag
self.btn.addTarget(self, action: "btnclicked:", forControlEvents: .TouchUpInside) //add button action
self.view.addSubview(btn) //add button in view
self.btnArray.append(btw)
func btnclicked(sender: UIButton)
//draw the circle from the UIView
class UnitView: UIView
override func drawRect(rect: CGRect)
let cirkel = UIGraphicsGetCurrentContext()
let rectangle = CGRect(x: 0.2 * bounds.width, y: 0.15 * bounds.height, width: 0.6 * bounds.width, height: 0.6 * bounds.width)
CGContextSetLineWidth(cirkel, 4.0)
CGContextAddEllipseInRect(cirkel, rectangle)
CGContextStrokePath(cirkel)
【问题讨论】:
是的,这是可能的。 "然后UIView
绘制一个三角形" ...如果您愿意,可以让UIView
绘制东西,但使用CAShapeLayer
是在视图中包含形状的更简单方法.
我投反对票的原因......请研究首字母缩写词 MVC。模型-视图-控制器。将其输入谷歌可能只需要一点时间,但在对回报进行一个小时的研究之后呢?你会给自己的职业生涯一些步骤。 (我是在充分尊重您已经知道的情况下这么说的。但也要承认您似乎还不知道的事情。祝您好运!)如果您了解 MVC,您应该不仅知道控制器和控制器之间的“传递数据”观点是它的意义所在,但也有些事情不是它的意义所在。
这个问题太笼统了。你问如何添加按钮?您是通过编程方式还是通过 Interface Builder 进行操作?您是否在问如何将该按钮链接到某个方法(例如 @IBAction
)?您是在问如何让该动作显示三角形或圆形?最重要的是,您确实应该编辑此问题,将其缩小到更具体的内容,澄清您的确切要求,并向我们展示您已经对该主题进行了哪些研究。请参考 Stack Overflow 上的帮助中心 about asking questions。
是的,你必须在学习上付出一些努力。我想说任何 ios 初学者书籍/参考将告诉你如何做到这一点。这里有一些关于 SO 的文章可能会对您有所帮助:***.com/questions/21652019/…、***.com/questions/34348275/… RayWenderlich 上的一些内容:raywenderlich.com/86477/…
【参考方案1】:
欢迎来到 SO。
这是一个非常基本的初学者问题。
当然可以。您可能应该创建 UIView 的自定义子类。我们称之为ShapeView
。给它绘制各种形状的方法,给它属性来存储它的当前状态。
现在您可以将 UIView 添加到您的视图控制器,并进入您的视图控制器场景的“身份检查器”并将该视图的类型更改为您的新 ShapeView
类。在您的视图控制器中为您的形状视图添加一个插座。
由于您的形状视图是具有自定义方法和属性的 UIView 的自定义子类,因此您的视图控制器可以调用这些方法并根据需要设置这些属性。
【讨论】:
【参考方案2】:UIViewController
有一个 view
类型为 UIView
的属性。
您可以使用self.view
从您的 UIViewController 类内部访问
从您的班级内部访问它:
class MyViewController: UIViewController
var buttonLabel:String
var buttonRadius:CGFloat = 90
var button = UIButton.buttonWithType(UIButtonType.System) as UIButton
init(buttonColour:CGColorRef, buttonLabel:String)
self.buttonColour = buttonColour
self.buttonLabel = buttonLabel
func drawButton()
button.frame = 100, 100, buttonRadius * 2, buttonRadius * 2)
button.layer.borderColor = buttonColour
button.setTitle(buttonLabel, forState: UIControlState.Normal)
button.addTarget(self, action: "pressed:", forControlEvents: UIControlEvents.TouchUpInside)
self.view.addSubview(button)
Swift class doesn't like self.view.addSubview()
【讨论】:
这个答案与问题无关。 问题是关于从UIViewController.
内部访问UIView
我错过了什么?
您错过了有关向自定义视图发送消息的问题,告诉它根据点击的按钮绘制不同的形状。
问题是“是否可以在 UIViewController 和 UIView 之间传递数据?如果可以,如何?”
这是第一行。阅读整个第二段。以上是关于是否可以使用 swift 在 UIViewController 和 UIView 之间传递数据?的主要内容,如果未能解决你的问题,请参考以下文章
Swift - 单击按钮更改 UIPageViewController 视图
检测 iPad 的方向 - Swift Playgrounds
将 segued 数据存储在单独的视图控制器上(swift 4)