Supertecnoboff
Supertecnoboff

Reputation: 6606

Create instance of a UIView - iOS

I am designing an iOS app with 10 main UIViewControllers in it. Each representing a different section of the app. Its basically for a company and shows info about the company.

One of the things I am doing on bottom section of the app (in all the different view controllers) is displaying a UIView which contains a map. This map shows a certain location.

Now it works, but the problem I have is that I have 10 copies of the same code and 10 copies of the same UIView.

Is there anyway I could make a small view controller with one class attached to it that would handle the map and then just create an instance of the view controller in all my 10 view controllers in my app?

I hope my question makes sense. Basically I want to know how I can go about reusing ONE UIView in all 10 of my ViewControllers. So I can just call it or something and it appears.

Update - this is basically what I am trying to achieve

enter image description here

Thanks, Dan.

Upvotes: 0

Views: 1087

Answers (2)

Jeffery Thomas
Jeffery Thomas

Reputation: 42598

View controllers can contain other view controllers. You can either use a container view in a storyboard or setup the relationship programmatically (see: Creating Custom Container View Controllers).

The storyboard container view is easiest, but the programmatic solution isn't too bad.

- (void)displayContentController:(UIViewController *)content
{
   [self addChildViewController:content];
   content.view.frame = [self frameForContentController];
   // NOTE: You could also add it to any subview of self.view.
   [self.view addSubview:content.view];
   [content didMoveToParentViewController:self];
}

- (CGRect)frameForContentController
{
    return CGRectMake(…);
}

- (void)viewDidLoad
{
    …
    MyMapViewController *mapViewController = …;
    [self displayContentController:mapViewController];
    …
}

- (void)dismissContentController:(UIViewController *)content
{
    [content willMoveToParentViewController:nil];
    [content.view removeFromSuperview];
    [content removeFromParentViewController];
}

Final Note: Have each parent view create its own instance of the map view controller. Resist the temptation to reuse an instance of the map view controller between parents.


Update to address questions

So lets say I had 2 of the same view controllers open at once and they both were displaying the same imported viewcontroller then it wouldn't work right?

You can't do this. An instance of a view controller can only have 1 parent view controller. Create separate instances for each use.

So if I create different instances, I can reuse the same view lets say 5 times in one view?

Yes, if you create different instances, you can put as many as you need on a view.

Let me be clear, an instance is a distinct memory location created using a constructor.

MyMapViewController *mapViewController1 = [[MyMapViewController alloc] initWithNibName:@"MyMapViewController" bundle:nil];
MyMapViewController *mapViewController2 = [[MyMapViewController alloc] initWithNibName:@"MyMapViewController" bundle:nil];

or

MyMapViewController *mapViewController1 = [self.storyboard instantiateViewControllerWithIdentifier:@"MapViewController"];
MyMapViewController *mapViewController2 = [self.storyboard instantiateViewControllerWithIdentifier:@"MapViewController"];

Updated to demonstrate dismissing a container view controller.


Here is a method for a child view controller, so it can use to dismiss itself.

- (void)dismissFromParentViewController
{
    [self willMoveToParentViewController:nil];
    [self.view removeFromSuperview];
    [self removeFromParentViewController];
}

Upvotes: 3

prabakaran iOS
prabakaran iOS

Reputation: 681

Please try below method:

  • Create "map controller" super class with inherit to UIViewController and define your need common method and variables.
  • Inherit your 10 child class into "map controller" super class. And connect common IBOutlets and IBActions to super class.
  • You can access common methods and variable to super class from child class(10 view controller child class).

Please refer below code

@interface mapController : UIViewController
{
    NSString *mapControllerVariables;
}
-(IBAction)mapControllerActions:(id)sender;

@end
@interface yourChileView : mapController
{

}
@end

Upvotes: 0

Related Questions