Question

The app I'm making utilizes multiple views. such as a disclaimer view, a view to display answer so on and so forth.Up until now this is the code that I've been using to switch from one view to another

-(IBAction)swichtogain:(id)sender{
    gainview *second = [[gainview alloc]initWithNibName:nil bundle:nil];
    [self presentModalViewController:second animated:YES];
    [second release];
}

I found this method in a tutorial, I was wondering, is this the best way to do it ? I use the same code to switch back n forth from one view to another for eg.

  -(IBAction)swichtoview1:(id)sender{
        view1 *view = [[gainview alloc]initWithNibName:nil bundle:nil];
        [self presentModalViewController:view animated:YES];
        [view release];
    }

and when in view1 if the user hits the back button the following code gets executed

  -(IBAction)swichtomainview:(id)sender{

       mainview *view = [[gainview alloc]initWithNibName:nil bundle:nil];
        [self presentModalViewController:view animated:YES];
        [view release];
    }

I haven't edited anything in the appdelegate files and this is a view based app. Does this method cause it to use more memory ? During the activity monitor test using the instruments , I noticed the memory usage gets higher every time I go from the main menu to another view and back to the main menu !. Is there a better way than this ?. Also one of the view is a calculator so when the user hits the calculate button it switches to the next view while changing the textfield to the answer, below is the code for that !

-(IBAction)calculate{
    MyClass *setnum = [[MyClass alloc]init];
    setnum.grade_num = grade;
    setnum.stage_num = stage;
    setnum.ex_lym = ex_ly;
    setnum.pos_lym = pos_ly;
    setnum.er_num = er;
    setnum.noderatio = pos_ly/ex_ly;



    if(text1.text.length <=0 ||text2.text.length <=0||text3.text.length<=0||text4.text.length<=0||text5.text.length <=0){

        UIActionSheet *action = [[UIActionSheet alloc]initWithTitle:@"Incomplete Values" delegate:self cancelButtonTitle:@"Ok" destructiveButtonTitle:nil otherButtonTitles:nil];    
        [action showInView:self.view];
        [action release];

    }else{
        answer *ans =[[answer alloc]initWithNibName:nil bundle:nil];
        [self presentModalViewController:ans animated:YES];

      float i =   calc_gain(setnum.grade_num, setnum.noderatio, setnum.stage_num, setnum.er_num);  
        NSString *result = [NSString stringWithFormat:@"%f",i];

        ans.answer1.text = result;
        ans.bar.hidden = NO;



        [ans release];
    }
    [setnum release];

}
Was it helpful?

Solution

You should consider using one of the provided container view controllers (UITabBarController, UINavigationBarController or UISplitViewController on the iPad and so on).

The way you use presentModalViewController is most likely the wrong way. For one, calling presentModalViewController will retain your views. Keeping allocating new controllers and displaying their views via presentModalView is therefore increasing your memory footprint with each navigation step.

In general, a viewcontroller which shows another modal viewcontroller is also responsible for dismissing it again. The way to dismiss a modal view controller is therefore to let the presented controller inform its parent through delegation and ask the parent to dismiss (often on tapping a 'done' button).

I'm not even sure whether stacking modalViewControllers is a supported scenario, but at least didn't find anything stated otherwise in the documentation.

OTHER TIPS

Asked here yesterday:

Switching views for iphone application - is this the right way?

I think another good way to go about this is to do this and add a univanigationcontroller:

[self.navigationController pushViewController:second animated:YES];
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top