1 / 18

Refactoring

Refactoring. Moving a console app to a UI app. Refactoring. Goal: change a console app to a UI app Principles: The main.m goes away The local variables in the main.m file become instance variables in the new viewController.m

roddy
Download Presentation

Refactoring

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Refactoring Moving a console app to a UI app

  2. Refactoring • Goal: change a console app to a UI app • Principles: • The main.m goes away • The local variables in the main.m file become instance variables in the new viewController.m • The functions that implemented console interactions with the user become IBAction methods for various UI components • Other classes in the console app are imported as are to the UI app For the code for these slides, see the class web site, References->Examples->AlienRefactored

  3. Creating the project • Create new single view project • I named mine “alienRefactored” • You get the appDelegate and the ViewController.m • Now import the class files (but not the main.m file) from the old project • FileAdd Files to “AlienRefactored” • See next slide for the dialog box

  4. Creating the project Choose the files Check this box

  5. Main.m • Does not exist in the new project (that we can see) • Open main.m from the old project. • Use code • If there were local variables, make them instance variables • See next slide

  6. XXXViewController.h #import <UIKit/UIKit.h> #import "alien.h” static const int NUMALIENS = 2; @interface CMPViewController :UIViewController{ alien *george, *sally; double timeToHome; double timeToPlace; double theSpeed; double theDistance; id theAliens[5];} @end Import any class you use Make constants that you need. These must be static

  7. XXXViewController.h • (void) viewDidLoad{ [super viewDidLoad]; // Do any additional setup after loading the view, typically from a nib. nextIndex = 0; } Use viewDidLoad method to initialize variables and initialize any dynamic memory.

  8. Designing the interface • See where the console app asked for input printf(“enter alien name:”); scanf(“%s”, theName); printf(“enter number of eyes:”); scanf(“%d”, numEyes); printf(“enter distance to home:”); scanf(“%f”, theDistance); printf(“enter speed of ship:”); scanf(“%f”, theSpeed); These become UITextFields You’ll need IBOutlets to access them in your code. You’ll also need a button to determine when to add this alien

  9. Interface

  10. Connections Create IBOutlets for the fields Create IBAction for the button

  11. IBActions • Fill in the action methods −(IBAction)addAlien:(UIButton *)sender { NSString *thePlanet = _nameField.text; theSpeed = [_speedField.textdoubleValue]; theDistance = [_distanceField.textdoubleValue]; intnumEyes = [_numEyesField.textintegerValue]; george =[[alien alloc] initWithNum: numEyesandDistance: theDistanceandPlanet: thePlanet]; if (nextIndex < 5) { theAliens[nextIndex++] = george; NSLog(@"the next alien lives at %@ and is %f miles from home at %f speed", ((alien *)theAliens[nextIndex - 1]).planet, ((alien *)theAliens[nextIndex - 1]).distanceToHome, ((alien *)theAliens[nextIndex - 1]).speedSpaceShip); } } If you don’t explicitly @synthesis properties, their getters and setters are preceded by an underscore (‘_’) Print to the console as an error check

  12. Fix the keyboard Connect to this method from every text field

  13. Fix the keyboard • Add the action method for the text fields • −(IBAction)didFinishEditing:(UITextField *)sender { • [sender resignFirstResponder]; • }

  14. Put in appropriate error messages • Array is full in - (IBAction)addAlien:(UIButton *)sender if (nextIndex < MAXALIENS) { // previous code else{ // the array is full UIAlertView *alert = [[UIAlertViewalloc] initWithTitle:@"Alien Alert!" message:@"Too many Aliens!" delegate:nilcancelButtonTitle:@"Phew!" otherButtonTitles:nil]; [alert show]; }

  15. Add more buttons • Each console option must have a component (usually a button). • Add more buttons and fields as necessary. • Hide components to minimize clutter

  16. More Buttons Add components to perform other functions from the console app

  17. Connect the new components I would also add an IBOutlet for the new field.

  18. Add bodies for the Action methods • For our “Calc Time” button • (IBAction)calcTimeHome:(UIButton *)sender { // pick an arbitrary alien if (nextIndex > 0){ float timeHome = [((alien *)theAliens[0]) calcTimeToHome]; // put the value into the text field _timeToHome.text = [NSStringstringWithFormat: @"%f", timeHome]; } } If you don’t explicitly @synthesis properties, their getters and setters are preceded by an underscore (‘_’)

More Related