Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 如何添加UIViewController';s视图作为子视图_Iphone_Uiview_Uiviewcontroller - Fatal编程技术网

Iphone 如何添加UIViewController';s视图作为子视图

Iphone 如何添加UIViewController';s视图作为子视图,iphone,uiview,uiviewcontroller,Iphone,Uiview,Uiviewcontroller,谷歌人注意,这个Q-A现在已经过时六年了 正如下面的Micky和其他人所提到的,现在每天都可以通过iOS中的容器来实现这一点 我有一个ViewController,它控制许多子视图。单击其中一个按钮时,我将初始化另一个viewcontroller,并将其视图显示为此视图的子视图。但是,子视图超出了子视图的帧边界,并且实际上填充了整个屏幕 有什么不对劲吗?我认为问题在于UIViewController的视图有一个帧(0,0320460),因此会填充整个屏幕(尽管只有在子视图帧边界内被触摸时,它才

谷歌人注意,这个Q-A现在已经过时六年了

正如下面的Micky和其他人所提到的,现在每天都可以通过iOS中的容器来实现这一点


我有一个ViewController,它控制许多子视图。单击其中一个按钮时,我将初始化另一个viewcontroller,并将其视图显示为此视图的子视图。但是,子视图超出了子视图的帧边界,并且实际上填充了整个屏幕

有什么不对劲吗?我认为问题在于UIViewController的视图有一个帧(0,0320460),因此会填充整个屏幕(尽管只有在子视图帧边界内被触摸时,它才会接收触摸事件)。如何调整框架的大小以适合作为子视图

简而言之,我需要帮助将viewcontroller的视图作为子视图添加到另一个viewcontroller的视图中


谢谢

更改
viewcontroller.view.frame
的帧大小,然后添加到子视图<代码>[viewcontrollerparent.view addSubview:viewcontroller.view]这个答案对于旧版本的iOS是正确的,但现在已经过时了。您应该使用米奇·邓肯的答案,其中包括定制容器。

别这样!
UIViewController
的目的是驱动整个屏幕。它只是不适合这种情况,而且它并没有真正添加任何您需要的内容

您只需要拥有自定义视图的对象。只需使用
UIView
本身的子类,就可以将其添加到窗口层次结构中,并且内存管理是完全自动的

将子视图NIB的所有者指向
UIView
的自定义子类。将
contentView
outlet添加到此自定义子类,并将其指向nib中的视图。在自定义子类中,执行如下操作:

- (id)initWithFrame: (CGRect)inFrame;
{
    if ( (self = [super initWithFrame: inFrame]) ) {
        [[NSBundle mainBundle] loadNibNamed: @"NibNameHere"
                                      owner: self
                                    options: nil];
        contentView.size = inFrame.size;
        // do extra loading here
        [self addSubview: contentView];
    }
    return self;
}

- (void)dealloc;
{
    self.contentView = nil;
    // additional release here
    [super dealloc];
}
(我假设您在这里使用
initWithFrame:
来构造子视图。)

使用:

[self.view addSubview:obj.view];

必须设置边界属性以适合该框架。框显其superview属性,并且边界限制视图本身坐标系中的框。

多亏了这些家伙,我才做到了这一点

添加UIView,将其连接到标题:

@property (weak, nonatomic) IBOutlet UIView *addViewToAddPlot;
在-(void)viewDidLoad中执行以下操作:

ViewControllerToAdd *nonSystemsController = [[ViewControllerToAdd alloc] initWithNibName:@"ViewControllerToAdd" bundle:nil];
    nonSystemsController.view.frame = self.addViewToAddPlot.bounds;
    [self.addViewToAddPlot addSubview:nonSystemsController.view];
    [self addChildViewController:nonSystemsController];
    [nonSystemsController didMoveToParentViewController:self];
享受

,苹果现在允许您为将一个UIViewController添加到另一个UIViewController而制作,特别是通过以下方法,以便确实可以嵌套UIViewController

编辑:包括就地汇总,以避免链接中断

我引述:

iOS提供了许多标准容器来帮助您组织应用程序。但是,有时您需要创建与任何系统容器提供的工作流不匹配的自定义工作流。也许在您的愿景中,您的应用程序需要一个特定的子视图控制器组织,并在它们之间进行专门的导航手势或动画转换为此,您需要实现一个自定义容器-

……和:

设计容器时,在容器、父视图控制器和其他视图控制器及其子视图控制器之间创建显式父子关系-

示例(由Apple docs提供)将另一个视图控制器的视图添加到容器的视图层次结构中

- (void) displayContentController: (UIViewController*) content
{
   [self addChildViewController:content];                 
   content.view.frame = [self frameForContentController]; 
   [self.view addSubview:self.currentClientView];
   [content didMoveToParentViewController:self];          
}

我觉得所有这些答案都有点不完整,因此以下是将viewController视图添加为另一个viewController视图的子视图的正确方法:

    [self addChildViewController:viewControllerToAdd];
    [self.view addSubview:viewControllerToAdd.view];
    [viewControllerToAdd didMoveToParentViewController:self];
如果愿意,可以将其作为代码片段复制到代码中。因此,似乎不理解代码替换格式,但它们将在Xcode中清晰显示:

    [self addChildViewController:<#viewControllerToAdd#>];
    [self.view addSubview:<#viewControllerToAdd#>.view];
    [<#viewControllerToAdd#> didMoveToParentViewController:self];
[self addChildViewController:];
[self.view addSubview:.view];
[didMoveToParentViewController:self];
通过添加子项自动调用。谢谢@iOSSergey


当自定义容器调用addChildViewController:方法时,它会在添加视图控制器之前自动调用要作为子对象添加的视图控制器的willMoveToParentViewController:方法


您可以使用PopupController进行相同的操作 其中一个是将UIViewController显示为子视图的SDK 你可以查一下

下面是同样的示例代码

popup = PopupController
        .create(self.navigationController!)
        .customize(
            [
                .layout(.center),
                .animation(.fadeIn),
                .backgroundStyle(.blackFilter(alpha: 0.8)),
                .dismissWhenTaps(true),
                .scrollable(true)
            ]
        )
        .didShowHandler { popup in
        }
        .didCloseHandler { popup in
    }
    let container = MTMPlayerAndCardSelectionVC.instance()
    container.closeHandler = {() in
        self.popup.dismiss()
    }

    popup.show(container)

我建议不要这样做。我为我的第一个iPhone应用程序做了这个,结果是一个巨大的奇怪的混乱,更不用说它打破了我试图用Interface Builder做的很多东西。在3.0文档中,他们明确表示每个屏幕上有一个视图控制器。你应该这样做!是的,甚至我也读过,但问题是如果我把它全部放在一个viewcontroller中,它是一个完整的代码,有很多iboutlet和动作,还有表格。因此,为了清晰和模块化,我尝试使用两个独立的viewcontroller,第二个只向主viewcontroller提供视图并处理自己的事件。这样,主viewcontroller会更干净一些。我该怎么做呢。我应该有多个带导航控制器的视图控制器还是一个大视图控制器。看看这个。虽然我试过,但它只起了部分作用。它不起作用。我应该在界面生成器中做些什么吗?虽然当时这是一个很好的答案,但这可能是iOS 5以来的过时理念。看下面我的回答,这是几年前写的。我还没有使用自定义容器,但这似乎是解决此问题的正确方法。感谢您为我的答案提供了插件。史蒂文:)在我的答案顶部添加了关于此问题的注释。您确定这是iOS 5吗?我在iOS 5上遇到了崩溃,但在iOS 6.iOS 5上运行良好,我们正在应用程序中使用它。事实证明,iOS 5中不支持的只是故事板嵌入序列。currentClientView的角色是什么?我无法理解文档中的内容。文档中说明应该在addChildViewController之后而不是之前调用didMoveToParentViewController。谢谢。。。伟大的解决方案!Whe