创建 UIView 的实例 - iOS

Create instance of a UIView - iOS

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

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

现在它可以工作了,但我遇到的问题是我有 10 个相同代码的副本和 10 个相同 UIView 的副本。

我是否可以制作一个小型视图控制器,并附加一个 class 来处理地图,然后在我的应用程序的所有 10 个视图控制器中创建一个视图控制器实例?

我希望我的问题有道理。基本上我想知道如何在我的所有 10 个 ViewController 中重用一个 UIView。所以我可以调用它或其他东西,它就会出现。

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

谢谢,丹。

视图控制器可以包含其他视图控制器。您可以在故事板中使用容器视图或以编程方式设置关系(参见: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];
}

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


更新以解决问题

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?

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

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

是的,如果您创建不同的实例,您可以根据需要在一个视图中放置任意数量的实例。

让我明确一点,实例是使用构造函数创建的不同内存位置。

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"];

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


这是 child 视图控制器的方法,因此它可以用来关闭自身。

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

请尝试以下方法:

  • 创建 "map controller" super class 并继承到 UIViewController 并定义您需要的通用方法和变量。
  • 继承你的 10 child class 到 "map controller" 超级 class。并将公共 IBOutlets 和 IBActions 连接到超级 class.
  • 您可以从 child class(10 view controller child class).

请参考以下代码

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

@end
@interface yourChileView : mapController
{

}
@end