views:

205

answers:

4

Hey all, trying to learn objective-c. It was going quite well, until I realized I was missing a link.

When building in the spirit of MVC, I understand it as you Model and View should never talk to eachother.

I have this problem I'm messing around with now.

  • A model containing a polygon class. Contains an polygon object with attributes like numberOfSides.

  • A controller, reading some UI elements and modifying the model. For example numberOfSides.

  • A view, containing a view drawing polygons.

Now, this is where the trouble arose. The view needs information about the object from the model. How do I get that? I tried some IBOutlet, but never got it to work.

I ended up creating a property for the view which could contain numberOfSides. Then I would a controller method which would call a view method back and set the numberOfSides.

I hope some of you can clarify this a bit for me and tell me how you should go ahead with this.

Thanks a bunch and goodnight! :)

A: 

Information passing in a proper MVC architecture should be done via a mediator such as an event manager.

The model would have an internal representation of everything that is needed for it to stay independent.

Now when a change occurs the model sends an event via the event manager to the view.

Vesa Nieminen
+5  A: 

MVC in Cocoa is slightly different than traditional MVC, so I'll answer with the Cocoa way.

You've got a controller object, which has a pointer to your Polygon object. Your controller should also have a pointer to your View (via an IBOutlet, most likely). As the polygon changes (whether numberOfSides or whatever), the controller needs to be aware of that and relay the information on to the view. Likewise, if the view is allowed to change the numberOfSides (say you have a slider to increase the number of sides), then the controller needs to be aware of that change and pass it to the Polygon object.

Basically, the purpose of the controller is to pass information back and forth from the view to the model and make sure that they stay synchronized.

Dave DeLong
A: 

I understand. My controller has an IBOutlet to the view and the polygon.

I forgot to mention that I'm using CG and drawrect to draw the polygon.

What I would like to do, and what I should do if I understand it correctly, is from the controller pass the numberOfSides to the view, asking it to draw with this number of sides. Like:

[view drawPolygon:myPolygon.numberOfSides];

But what I have to do, because drawrect gets called automatically, is make some instance variable of the view available to contain the numberOfSides, which the controller would set. And then call [view setNeedsDisplay];

Does this make sense? Since the view cannot access the myPolygon directly. How would you approah this?

simonwh
A: 

You can also give your view a read-only polygon instance variable (just a pointer to your polygon instance in the controller; read-only because you don't want your view to be able to change the model). This is not necessarily a violation of MVC principles.

Or if you want a very loose coupling between model and view, try key-value observing: your model dispatches a notification saying "hey my number of sides changed to 8" and your view listens to these notifications and redraws itself as needed.

Another option is to give your view a delegate (= your controller) and then call something like [delegate numberOfSidesToDraw] from within the view class.

All three methods have pros and cons.

RoelandVL