如何在Objective-C中添加一个具有自己的UIViewController的子视图?
如何在Objective-C中添加一个具有自己的UIViewController的子视图?
我正在处理具有自己的UIViewControllers
的子视图的问题。我有一个带有视图(浅粉色)和两个按钮的UIViewController
工具栏。当按下第一个按钮时,我希望蓝色视图显示,当按下第二个按钮时,黄色视图显示。如果我只想显示一个视图,这应该很容易。但是蓝色视图将包含一个表格,因此它需要自己的控制器。这是我的第一课。我从这个SO问题开始,我了解到我需要一个表格的控制器。
所以,我要退后一步,采取一些初级步骤。下面是一个简单起点的图片,显示了我的实用ViewController
(主视图控制器)和其他两个控制器(蓝色和黄色)。想象一下,当实用ViewController
(主视图)首次显示时,蓝色(默认)视图将显示在粉色视图所在的位置。用户将能够点击这两个按钮来来回切换,粉色视图将永远不会显示。我只想要蓝色视图进入粉色视图的位置,黄色视图进入粉色视图的位置。希望这样说得清楚。
我正在尝试使用addChildViewController
。从我看到的,有两种方法可以做到这一点:在storyboard
中使用容器视图或以编程方式使用addChildViewController
。我想以编程方式做到这一点。我不想使用NavigationController
或选项卡栏。我只想添加控制器,并在按下相关按钮时将正确的视图推入粉色视图。
下面是我目前的代码。我只想在粉色视图的位置显示蓝色视图。根据我所看到的,我应该能够使用addChildViewController
和addSubView。这段代码对我来说并没有做到这一点。我的困惑正在逐渐增加。有人可以帮助我在粉色视图的位置显示蓝色视图吗?
这段代码的目的不是做任何其他事情,只是在viewDidLoad中显示蓝色视图。
IDUtilityViewController.h
#import@interface IDUtilityViewController : UIViewController @property (strong, nonatomic) IBOutlet UIView *utilityView; @end
IDUtilityViewController.m
#import "IDUtilityViewController.h" #import "IDAboutViewController.h" @interface IDUtilityViewController () @property (nonatomic, strong) IDAboutViewController *aboutVC; @end @implementation IDUtilityViewController - (void)viewDidLoad { [super viewDidLoad]; self.aboutVC = [[IDAboutViewController alloc]initWithNibName:@"AboutVC" bundle:nil]; [self addChildViewController:self.aboutVC]; [self.aboutVC didMoveToParentViewController:self]; [self.utilityView addSubview:self.aboutVC.aboutView]; } @end
--------------------------编辑------------------------------
self.aboutVC.aboutView为空。但是我在storyboard
中连接了它。我还需要实例化它吗?
问题的原因是在使用故事板创建控制器时,应该使用instantiateViewControllerWithIdentifier:
来实例化控制器,而不是initWithNibName:bundle:
。此外,当将视图添加为子视图时,应给它一个frame。因此,解决方法是在viewDidLoad
方法中进行以下操作:
- (void)viewDidLoad { [super viewDidLoad]; self.aboutVC = [self.storyboard instantiateViewControllerWithIdentifier:@"aboutVC"]; // 请确保在故事板中给控制器设置了相同的标识符 [self addChildViewController:self.aboutVC]; [self.aboutVC didMoveToParentViewController:self]; self.aboutVC.view.frame = self.utilityView.bounds; [self.utilityView addSubview:self.aboutVC.aboutView]; }
关于设置frame的问题,如果要添加的视图是全屏的话,可能不是必需的,但我通常会添加它以确保正确。此外,在这种情况下,我不确定self.utilityView
是整个视图还是工具栏下方的部分视图,如果是后者的话,可能确实需要设置frame。
另一位回答者提到OP在故事板中使用了容器视图,但是他们希望在代码中实现这一功能。
感谢提供信息。我想知道是否应该使用instantiateViewControllerWithIdentifier
,但有点困惑。此外,是的,self.utilityView
不是整个视图。三个子视图的大小相同,所以我认为不需要设置frame大小。我在办公室时会尝试你的建议。
以上就是关于如何在Objective-C中添加具有自己的UIViewController的子视图的问题的原因和解决方法。
在Objective-C中如何添加具有自己的UIViewController的子视图?
问题的出现的原因:
iOS中的一切都是容器视图,这是创建应用程序的基本方式。即使是最简单的应用程序,屏幕上的每个元素也都是一个容器视图。然而,在Objective-C中添加具有自己的UIViewController的子视图可能会有一些困惑。
解决方法:
要添加一个具有自己的UIViewController的子视图,可以按照以下步骤进行操作:
(A)将一个容器视图拖入您的场景中。这是在场景视图中拖入任何元素(如UIButton)时所做的操作。
(B)单击新的视图控制器并更改其类。
在代码中,可以使用以下方法将子视图与其自己的UIViewController连接起来:
var snap:Snap? var clock:Clock? var other:Other? override func prepare(for segue: UIStoryboardSegue, sender: Any?) { if (segue.identifier == "segueSnap") { snap = (segue.destination as! Snap) } if (segue.identifier == "segueClock") { clock = (segue.destination as! Clock) } if (segue.identifier == "segueOther") { other = (segue.destination as! Other) } }
要连接到父视图控制器,可以使用以下方法:
class Snap { var myBoss:Dash? override func viewDidAppear(_ animated: Bool) { // MUST be viewDidAppear super.viewDidAppear(animated) myBoss = parent as? Dash }
需要注意的是,这种方法只适用于容器视图。
此外,还可以通过动态加载另一个故事板来创建容器视图。可以使用以下代码来实现:
let map = UIStoryboard(name: "Map", bundle: nil) .instantiateViewController(withIdentifier: "MapID") as! Map addChild(map) map.view.frame = dynamicContainerView.bounds dynamicContainerView.addSubview(map.view) map.didMove(toParent: self)
这样可以将动态加载的故事板添加到容器视图中。
通过上述方法,可以很容易地在Objective-C中添加具有自己的UIViewController的子视图。这些方法可以帮助开发人员更好地理解和解决相关问题。