创建 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
我正在设计一个 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