如何在 ios5 的 UIViewController 中显示 UIView?

Posted

技术标签:

【中文标题】如何在 ios5 的 UIViewController 中显示 UIView?【英文标题】:How to show a UIView inside a UIViewController in ios5? 【发布时间】:2013-02-16 11:36:06 【问题描述】:

我在XIB 文件中设计了一个UIView。基本上带有一个导航栏和一个按钮来关闭UIVIew。我想在整个应用程序的几个UIViewControllers 中显示这个UIView。 下面是我到目前为止所使用的代码。但是UIView 没有显示出来

我的ViewControllers 是在storyboard 中设计的,但是我需要一个简单的 UIView,这就是为什么我创建了一个新的 UIView 自定义子类以及一个同名的 xib 文件。文件的所有者也设置为自定义子类。这里还需要什么?

@interface BottomSlidingView : UIView   //this is my UIView





@implementation BottomSlidingView          

 - (id)initWithFrame:(CGRect)frame
 
   self = [super initWithFrame:frame];
   if (self) 
   [self setUserInteractionEnabled:YES];
   NSLog(@"Bottom View Loaded");   //I get this log entry but the view doesn't showup.


    return self;
  

- (BOOL)loadMyNibFile 
if (![[NSBundle mainBundle] loadNibNamed:@"BottomSlidingView" owner:self options:nil]) 
    return NO;

    return YES;

这就是我在UIViewController 中调用自定义UIView 的方式。

 -(void)shareButton:(UIBarButtonItem *)button
 
   NSLog(@"share button clicked");
   BottomSlidingView *bsv = [[BottomSlidingView alloc] initWithFrame:CGRectMake(20, 480, 280, 420)];
   [bsv loadMyNibFile];
   [self.view insertSubview:bsv belowSubview:self.optionsToolBar]; //this toolbar is a subview that I am adding to this view controller.

 

【问题讨论】:

【参考方案1】:

我发现您的方法存在一些问题:

    从 nib 文件创建视图实例,而不是使用 initWithFrame: 实例化它。例如(如果自定义视图是 nib 文件中唯一的根级对象):

    + (instancetype)bottomSlidingView
    
        return [[[UINib nibWithNibName:@"BottomSlidingView" bundle:nil] instantiateWithOwner:nil options:nil] lastObject];
    
    

    UIView 子类中实现 awakeFromNib 或 initWithCoder: 而不是 initWithFrame:(从 nib 加载时不会调用)。

在您的视图控制器中,您可以使用以下内容来创建视图:

- (void)shareButtonPressed:(id)sender

    BottomSlidingView *slidingView = [BottomSlidingView bottomSlidingView];
    [slidingView setFrame:CGRectMake(20, 480, 280, 420)];
    [[self view] insertSubview:slidingView belowSubview:[self optionsToolBar]];

希望对您有所帮助。

【讨论】:

如果我使用上面显示的类方法,即 + (UIView *)bottomSlidingView,您能否详细说明如何从 UIViewController 调用它,因为我对如何在单击按钮时调用它感到困惑行动。 好吧,我确实在我的 UIViewController 中实现了该方法但是现在我收到一个错误,即...... self BottomSlidingView * 0x00000000 aDecoder NSCoder * 0x0993e400 要调用 + (UIView *)bottomSlidingView 你应该使用 [BottomSlidingView bottomSlidingView]; 好吧....我做了一个示例项目只是为了测试这个。然而,同样的错误正在发生。任何人都可以对这个问题有所了解。Xcode 在这一行显示 EXC_bad_access 错误“self = [super initWithCoder:aDecoder];”【参考方案2】:

如果你想在另一个视图控制器中重用 UIViewController 的 UIView,你需要使用这个......

YourViewController * child = [[YourViewController alloc] initWithNibName:@"YourViewController" bundle:nil];//View controller of view , you want to reuse
[self.view addSubView:child.YourView]; //YourView = Name of view, you want to reuse
[self addChildViewController:child];
[child release];

添加 childViewController 后,所有 IBAction 都将在 child 中工作。

并且在删除这个视图之后你必须从 parentViewController 中删除 YourViewController 否则会有内存问题.......

【讨论】:

告诉我你的困惑。我创建了一个包含 32 个视图控制器的应用程序,而没有使用导航控制器或标签栏控制器或故事板,但只使用了这个概念...... 我有几个在故事板中设计的视图控制器。我使用 .Xib 文件来设计一个只是普通的 UIView。现在为了在故事板中的一个 ViewControllers 中显示这个 UIView 我尝试了上面的方法代码....但是现在视图没有显示出来......我可以通过代码显示 UIView ......但我需要多次使用它......这就是为什么我想使用 . Xib 文件......把它想象成一个自定义操作表视图......结合了故事板和 .xib。 Sushrut,对不起,我没有在故事板上尝试过此代码,但如果您使用的是 XIB,那么它会正常工作。如果你只有一个 VIEW 可以重用,那么使用 Xib 并制作一个 mainWindow.xib。制作 mainWindow.xib 使用 THIS 教程。然后在 mainwindow.xib 中添加该视图并在 appdelegate 中给出出口。当你想使用这个视图时写[appdel.window addSubView:appdel.yourView]希望这对你有帮助

以上是关于如何在 ios5 的 UIViewController 中显示 UIView?的主要内容,如果未能解决你的问题,请参考以下文章

应用程序处于后台模式时如何在 iOS5 上获取用户位置?

如何在 iOS5 中重新请求照片访问权限?

当我们在 ios5.1、ios6 等其他操作系统版本中拥有应用程序时,如何在 ios5 模拟器中启动应用程序?

IOS5中如何自定义UINavigationBar

IOS5 - 如何在以编程方式创建的视图中播放视频?

iOS5:如何在没有 UINavigationController 的情况下处理视图之间的导航