views:

111

answers:

1

I've recently been doing a lot of Objective-C programming, and just got back into doing more iPhone development. I've done a lot of programming using MVC in other languages/frameworks, but I just want to make sure I'm using MVC properly in my iPhone Development.

I created a new iPhone Utility Application, which creates two views: MainView and FlipsideView. Both have a controller (FlipsideViewController and MainViewController) and XIB file of their own.

What I've been doing is putting the IBOutlet UIControl myControl variables in my MainView.h or FlipsideView.h files and then tying the controls in Interface Builder to those variables. Then I put any IBAction SomeAction myAction methods in the MainViewController.h and FlipsideViewController.h files and tying the events to those methods in Interface Builder.

This seems to be conceptually correct, but seems to cause problems. Say I have a button that when clicked it changes a label's text. So the Controller doesn't have a clue of what the variable name of the label is in the OnTouchUp event handler for my button. So I make a @property for it. But since the MainViewController.view property isn't of type MyView, I get warnings or errors whenever I try to access those properties from the view controller.

I am doing this correctly? Is there a better way to do this? If this is correct, how do I properly work with those variables without getting warnings or errors?

Thanks

Here's some code showing what I'm doing:

MainView.h

#import ...

@interface MainView : UIView
{
    IBOutlet UILabel* label;
    IBOutlet UIButton* button;
}

@property UILabel* label;
@property UIButton* button;

@end

MainViewController.m

-(void) buttonTouchUp:(id) sender
{
    self.view.label.text = @"The button was pressed!"; //This gives error because label is not in the view structure or union
    [self.view label].text = @"The button was pressed!"; //This gives a warning
}

I know I can cast the view to be of the right type, but that seems like a hack job. I know I can live with the warning, but a warning says to me that I'm doing something that I probably shouldn't be doing. I don't believe the SDK would set me up to do have to do something like that all the time.

I must just be misunderstanding what the View is supposed to be and I'm using it incorrectly.

+2  A: 

Most code I've seen and written myself keeps all the outlets and the actions on the controller. The button sends a message to the controller (via IBAction), then the controller updates the label (via IBOutlet). In other words, putting outlets on your views is unusual.

Views shouldn't be connected to other views unless they have some special relationship, like maybe back/forward buttons that target a UIWebView... but even then, you find out you need a controller to enable/disable the buttons as appropriate.

benzado
so if I put everything on the ViewController, what's the point of having the View class in the first place? If I'm just putting everything in the ViewController?
Joel
The point of a View class is to draw stuff on the screen and receive touch events. Most of the time you use Apple's view classes, you'd only write your own for a custom widget or if you're writing a game.
benzado
Oh, okay. I was just confused of what the View was used for. I guess I have some code to fix up. This makes a lot more sense.Thanks for the clarification.
Joel