创建UIView的实例 - iOS

时间:2015-03-25 10:30:44

标签: ios objective-c uiview instance viewcontroller

我正在设计一个包含10个主要UIViewControllers的iOS应用程序。每个代表应用程序的不同部分。它基本上适用于公司,并显示有关公司的信息。

我在应用程序底部(在所有不同的视图控制器中)正在做的事情之一是显示包含地图的UIView。此地图显示了某个位置。

现在它有效,但我遇到的问题是我有10份相同的代码和10份相同的UIView。

无论如何,我可以创建一个小视图控制器,其中附加一个类来处理地图,然后在我的应用程序中的所有10个视图控制器中创建一个视图控制器实例?

我希望我的问题有道理。基本上我想知道如何在所有10个ViewControllers中重用ONE UIView。所以我可以把它称之为它,或者它出现了。

更新 - 这基本上就是我想要实现的目标

enter image description here

谢谢,Dan。

2 个答案:

答案 0 :(得分:3)

视图控制器可以包含其他视图控制器。您可以在故事板中使用容器视图,也可以以编程方式设置关系(请参阅:Creating Custom Container View Controllers)。

故事板容器视图最简单,但程序化解决方案也不错。

- (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];
}

最后注意:让每个父视图创建自己的地图视图控制器实例。抵制在父母之间重用地图视图控制器实例的诱惑。


更新以解决问题

  

那么让我说我有两个相同的视图控制器同时打开它们都显示相同的导入视图控制器然后它不能正常工作?

你不能这样做。视图控制器的实例只能有1个父视图控制器。为每次使用创建单独的实例。

  

因此,如果我创建不同的实例,我可以在一个视图中重复使用相同的视图5次?

是的,如果您创建不同的实例,则可以在视图上放置任意数量的实例。

让我说清楚,实例是使用构造函数创建的独特内存位置。

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

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

更新以演示解雇容器视图控制器。


这是一个子视图控制器的方法,因此它可以用来解除它自己。

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

答案 1 :(得分:0)

请尝试以下方法:

  • 创建"地图控制器"继承UIViewController的超类,定义你需要的通用方法和变量。
  • 将您的10个子课程继承到"地图控制器"超级。并将常见的IBOutlets和IBActions连接到超级类。
  • 您可以从子类(10视图控制器子类)访问常用方法和变量到超类。

请参阅以下代码

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

@end
@interface yourChileView : mapController
{

}
@end