【问题标题】:iOS, How to load a .xib into another .xib?iOS,如何将 .xib 加载到另一个 .xib 中?
【发布时间】:2014-02-13 17:32:38
【问题描述】:

我正在寻找一种方法来重用一个 .xib 文件中的内容并将其加载到多个其他 .xib 文件中。原因是我可以为我的应用程序中的所有页面重用我的部分设计。我知道在 android 编程中,你可以通过在你的设计 .xml 文件中写入 include nameOfFile 来做到这一点。

我尝试了以下方法:

创建了一个.xib 文件链接到一个.h 和.m 文件,它们都被称为ActionBarViewController .xib/.h/.m。

之后我在我的 ActionBarViewController.m 文件中设置了背景色。

self.view.backgroundColor = [UIImage gbBlue]; 

我的 ActionBarViewController .h 如下所示:

@interface ActionBarViewController : UIViewController {

}
@property (retain, nonatomic) IBOutlet UIView *actionBarView;

@end

然后我将我的 ActionBarViewController 包含在我的 mainMenu.m 中(这是我想要加载我的 ActionBar 视图的 .xib 的 .m 文件)。

现在在我的 mainMenu.m 的 viewDidLoad 中,我尝试像这样加载它。

ActionBarViewController *actionbarViewController = [[ActionBarViewController alloc] init];

[self.view addSubview:actionbarViewController.actionBarView];
[actionbarViewController release];

我也试过了:

ActionBarViewController *obj=[[[NSBundle mainBundle] loadNibNamed:@"ActionBarViewController" owner:self options:nil]objectAtIndex:0];

obj.actionBarView.frame=CGRectMake(70, 160, 180, 80);

[self.view addSubview:obj.actionBarView];
[obj release];

但它不起作用,所以我错过了什么吗?或者这在 iOS 编程中是不可能的?

【问题讨论】:

  • 请参阅更新的问题。
  • 谁能帮我进一步解决这个问题?
  • 还是卡住了,请大家帮忙!

标签: ios iphone objective-c xib addsubview


【解决方案1】:

您正在通过以下方式创建控制器:

ActionBarViewController *actionbarViewController = [[ActionBarViewController alloc] init];

如果你想通过 xib 初始化控制器,这是不合适的。正确的做法是:

ActionBarViewController *actionbarViewController = [[ActionBarViewController alloc] initWithNibName:@"ActionBarViewController" bundle:nil];

【讨论】:

  • 没有发现错误,但仍然什么也看不到视图的背景颜色或我放在 ActionbarViewController 上的图像:(
【解决方案2】:
  1. 你只需创建第二个 xib 的对象并添加到 main 查看,如下图:

    SecondXib obj=[[[NSBundle mainBundle] loadNibNamed:@"SecondXib" owner:self
    options:nil]objectAtIndex:0];
    
    obj.frame=CGRectMake(70, 160, 180, 80);
    
    [self.view addsubview:obj];
    

注意:您必须使用 secondXib 作为 UIView

【讨论】:

  • 2 个问题。 loadNibNamed 是做什么用的? obj.frame=CGRectMake 是做什么用的?
  • loadNibNamaed 用于您要添加的特定 xib 视图,并为您要添加特定 xib 视图的位置设置框架。
  • 我收到 2 个错误。 1.接口类型不能静态分配。 2. 在“ActionBarViewController*”类型的对象上找不到属性“frame”
  • 你的“ActionBarViewController”的类型是什么,它必须是 UIView 我已经写在笔记里了。
  • @property (retain, nonatomic) IBOutlet UIView *actionBarView;那是我指向视图的指针。所以看起来它是一个 UIView
【解决方案3】:

如果您有一个主菜单的xib,并且您正尝试加载在该xib 中定义的特定view。让我们将其命名为containerView。将containerView 与您的主.m 文件init 链接到viewDidLoad 中的ActionBarView。使用ActionBarView 中的一些类方法来加载nib 文件并返回结果。比在您的containerView 中添加subview

//viewDidLoad
    ActionBarView *actionBar = [ActionBarView getInstance];
    [containerView addSubview:actionBar]

//Class method getInstance in ActionBarViewController
    ActionBarView *actionBar = [[[NSBundle mainBundle] 
                                          loadNibNamed:@"ActionBarViewController" 
                                          owner:nil options:nil] lastObject];
    if ([actionBar isKindOfClass:[ActionBarView class]])
        return actionBar;
    else
        return nil;

ActionBarViewUIView

【讨论】:

  • 我正在尝试从另一个单独的 .xib 文件加载视图,以便可以在多个其他 .xib 文件中使用该视图
  • 这就是我所说的...无论您想在哪里使用该 xib 文件(在您的情况下为 ActionBar)在您的 mainMenu xib 和 viewDidLoad 的 mainMenu 创建一个容器视图以查看它的操作栏。对于实例化,您可以使用如上所示的类方法。比在 mainMenu 的 viewDidLoad 方法中添加容器中的 actionBar 实例
  • 而且你实际上不需要另一个视图控制器,就像你制作了一个 ActionBarViewController。如果您只是想在另一个 xib 中重用它,那么只需将其设为 UIView。它将一次又一次地重复使用。您只需要在主 xib 的某个容器中添加您的操作栏 UIView
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-17
  • 1970-01-01
相关资源
最近更新 更多