Is it possible to pass data between the UIViewController and UIView using swift?

1.4k views Asked by At

Is it possible to pass data between the UIViewController and the UIView? if yes, how?

For example when you press button1 the UIViewController says to the UIView that the person has pressed button1 and then the UIView draws a triangle. But if you then press button2 the UIViewController says to the UIView that he has now pressed button2 and then the UIView eliminates the triangle and draws a circle.

The buttons are build programmatically.

The question is how i can invoke the shapes which i have drawn with drawRect within the UIView in the UIViewController.

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)
    }
}
2

There are 2 answers

8
Alan On

UIViewController has a view property of type UIView.

You can access from inside your UIViewController class using self.view

Accessing it from inside your class:

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()

0
Duncan C On

Welcome to SO.

This is a pretty basic beginner's question.

Sure it's possible. You should probably create a custom subclass of UIView. Let's call it ShapeView. Give it methods to draw various shapes, and give it properties to store it's current state.

Now you can add a UIView to your view controller, and go into the "identity inspector" for your view controller scene and change the type of that view to your new ShapeView class. Add an outlet to your shape view in your view controller.

Since your shape view is a custom subclass of UIView with custom methods and properties, your view controller can invoke those methods and set those properties as needed.