【问题标题】:Is it possible to pass data between the UIViewController and UIView using swift?是否可以使用 swift 在 UIViewController 和 UIView 之间传递数据?
【发布时间】: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 的文章可能会对您有所帮助:stackoverflow.com/questions/21652019/…stackoverflow.com/questions/34348275/… RayWenderlich 上的一些内容:raywenderlich.com/86477/…

标签: ios swift uiview uiviewcontroller message-passing


【解决方案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 之间传递数据?如果可以,如何?”
    • 这是第一行。阅读整个第二段。
    猜你喜欢
    • 1970-01-01
    • 2020-10-23
    • 2014-05-22
    • 1970-01-01
    • 2021-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多