【问题标题】:How to show a UIView inside a UIViewController in ios5?如何在 ios5 的 UIViewController 中显示 UIView?
【发布时间】: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.

 }

【问题讨论】:

    标签: iphone ios uiview uiviewcontroller


    【解决方案1】:

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

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

      + (instancetype)bottomSlidingView
      {
          return [[[UINib nibWithNibName:@"BottomSlidingView" bundle:nil] instantiateWithOwner:nil options:nil] lastObject];
      }
      
    2. UIView 子类中实现 awakeFromNibinitWithCoder: 而不是 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]希望这对你有帮助
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-14
    • 1970-01-01
    相关资源
    最近更新 更多