如何在Objective-C中添加一个具有自己的UIViewController的子视图?

10 浏览
0 Comments

如何在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中连接了它。我还需要实例化它吗?

0
0 Comments

问题的原因是在使用故事板创建控制器时,应该使用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的子视图的问题的原因和解决方法。

0
0 Comments

在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的子视图。这些方法可以帮助开发人员更好地理解和解决相关问题。

0