Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/105.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
Ios 添加另一个视图控制器';s视图作为子视图_Ios - Fatal编程技术网

Ios 添加另一个视图控制器';s视图作为子视图

Ios 添加另一个视图控制器';s视图作为子视图,ios,Ios,我试图获得一个弹出效果,并希望在另一个视图控制器中设计弹出视图,以便我可以使用xib来完成它 当我使用presentViewController或pushViewController并将背景设置为透明时,我最终会看到窗口的背景色 我试着用这段代码将子视图添加到导航控制器的视图中,这样我就可以用透明的背景覆盖整个屏幕。我也有标签栏来掩盖 InfoVC *vc = [[InfoVC alloc] initWithNibName:@"InfoVC" bundle:nil]; [self.navigat

我试图获得一个弹出效果,并希望在另一个视图控制器中设计弹出视图,以便我可以使用xib来完成它

当我使用presentViewController或pushViewController并将背景设置为透明时,我最终会看到窗口的背景色

我试着用这段代码将子视图添加到导航控制器的视图中,这样我就可以用透明的背景覆盖整个屏幕。我也有标签栏来掩盖

InfoVC *vc = [[InfoVC alloc] initWithNibName:@"InfoVC" bundle:nil];
[self.navigationController.view addSubview:vc.view];
我的问题是在我的InfoVC中,当我尝试关闭它时,应用程序将崩溃,并显示一些EXC_BAD_访问消息:

[self.view removeFromSuperview];
编辑:


我找到了一种方法来阻止它崩溃,但将InfoVC设置为MainVC中的一个属性。我认为崩溃的原因是,当我在InfoVC内部的操作中调用“self.view”时,它不知道self是MainVC内部的InfoVC。

您是否应该使用以下命令将视图从其superview中删除

[vc.view removeFromSuperview];

您不能让
UIView
删除它的子视图,子视图本身必须从它的超级视图中删除自己。您可以很容易地在子视图中循环,并像这样删除它们

for (UIView *view in vc.view.subviews) {
  [view removeFromSuperview];
}
参考文件:

不,不,永远不要那样做

如果一个视图控制器的视图没有内置的工具,那么为了将它放在另一个视图控制器的视图中(或者之后将其删除),您必须遍历一个复杂的舞蹈(UISplitViewController的方式,或导航控制器管理在其中推送和弹出的视图控制器视图的方式)

阅读客户容器控制器。我书中的一个示例如下:

在“模式”显示的视图控制器出现后,现在显示的视图控制器下的视图将被删除;这节省了内存,并简化了渲染。不过,在您的情况下,您最终也会看到“模式”显示视图后面的窗口

下一步自然也是合乎逻辑的,就是简单地将一个视图控制器的视图塞进另一个视图中。但是,正如您所发现的,这是有问题的。新插入的视图被视图层次结构安全地保留,是安全的,但新的视图控制器没有那么幸运,它很快就会被释放。因此,当这个新视图如果要联系其控制器,您将获得一个
EXC_BAD_访问权限
并崩溃。正如您所发现的,一个解决方法是简单地让原始视图控制器保留对新视图控制器的强引用。这可能工作得不好。您仍然有很大的机会获得
UIViewControllerHierarchyConsistencyExceptionn

当然,如果您只想添加在IB中创建的小视图,则不需要使用视图控制器作为“
文件的所有者”
,并且有许多从
xib
文件创建视图实例的示例

这里更有趣的问题是,“苹果会/会怎么做?”苹果一直说视图控制器是封装工作单元的正确控制器。例如,他们的
tweetcomposeviewcontroller
,你展示了它,它似乎是浮动的。如何

我想到的实现这一点的第一种方法是有一个不清晰的清晰背景。也就是说,在显示视图控制器出现之前创建一个屏幕图像,并将其设置为删除显示视图之前的背景。例如(下面的说明):

QuickSheetViewController.xib

QuickSheetViewController.h

#import <UIKit/UIKit.h>
@interface QuickSheetViewController : UIViewController
- (IBAction)dismissButtonPressed:(id)sender;
@end

您将在背景中看到足够长的动画,然后我们使用保存的图像隐藏显示视图的删除。

在xib中创建视图不需要其他视图控制器。您可以拥有一个只是视图的xib。现在,根据您对该视图所做的操作,您可能希望它拥有自己的cocontroller,但它不是必需的。一个xib就是一个视图。我想这就是我想要的。有一个教程来说明如何使用它吗?你需要一个教程做什么?只需选择“新文件”,选择“用户界面”作为类型,然后选择“视图”。抱歉,我还是新手,但我使用NSNib搜索并找到了一些其他线程。我认为xib必须与视图控制器一起使用。我会记住这一点。我还没有准备好创建自己的容器=t然后只使用一个视图,不使用额外的视图控制器。您可以随时在其他视图中弹出视图。只是不要错过在这个过程中使用视图控制器。@RosePerrone当书从iOS 5转到iOS 6时,页码发生了变化。很明显,这个例子的意思是:现在两个链接都断了。你能把书中最重要的部分复制到你的答案中吗?这样你的答案就不会再受到链接损坏的影响了?
#import <UIKit/UIKit.h>
@interface QuickSheetViewController : UIViewController
- (IBAction)dismissButtonPressed:(id)sender;
@end
#import "QuickSheetViewController.h"
#import <QuartzCore/QuartzCore.h>
@implementation QuickSheetViewController {
    UIImage *_backgroundImage;
}
-(void)renderAndSaveBackgroundImageFromVC:(UIViewController *)vc{
    UIGraphicsBeginImageContext(vc.view.bounds.size);
    [vc.view.layer renderInContext:UIGraphicsGetCurrentContext()];
    _backgroundImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
}
-(void)viewWillAppear:(BOOL)animated{
    [super viewWillAppear:animated];
    // save an image of the current view, and set our background to clear so we can see the slide-in.
    [self renderAndSaveBackgroundImageFromVC:self.presentingViewController];
    self.view.backgroundColor = [UIColor clearColor];
}
-(void)viewDidAppear:(BOOL)animated{
    [super viewDidAppear:animated];
    // Time to use our saved background image.
    self.view.backgroundColor = [UIColor colorWithPatternImage:_backgroundImage];
}
-(void)viewWillDisappear:(BOOL)animated{
    [super viewWillDisappear:animated];
    // Set our background to clear so we can see the slide-out.
    self.view.backgroundColor = [UIColor clearColor];
}
- (IBAction)dismissButtonPressed:(id)sender {
    [self dismissViewControllerAnimated:YES completion:nil];
}
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation{
    return (interfaceOrientation == UIInterfaceOrientationPortrait);
}
@end
QuickSheetViewController *newVC = [[QuickSheetViewController alloc] initWithNibName:nil bundle:nil];
[self presentViewController:newVC animated:YES completion:nil];