是否可以使用 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 Firebase

Swift - 单击按钮更改 UIPageViewController 视图

检测 iPad 的方向 - Swift Playgrounds

将 segued 数据存储在单独的视图控制器上(swift 4)

使用 UIViewContentModeScaleAspectFill 裁剪到边界

是否可以使用 swift 在 UIViewController 和 UIView 之间传递数据?