Objective-c - 将对象从XIB文件导入视图控制器

时间:2012-11-12 12:38:31

标签: iphone objective-c xib viewcontroller

所以我有一个XIB文件,其中包含一个视图。在该视图中,我想添加自定义对象,然后能够获取这些对象,并在视图控制器中使用它们,我可以在其中创建其他内容programmatically

我的XIB文件名为"MyXibLibrary.xib" 我希望将对象添加到的视图控制器称为"ContactDetailsViewController"

我的视图控制器正在从这样的UITableViewController推送:

 ContactDetailsViewController *detailViewController = [[ContactDetailsViewController alloc] init];

在我的ContactDetailsViewController viewWillAppear里面,我有这个代码来获取XIB对象:

 UIView *xibView = [[[NSBundle mainBundle] loadNibNamed:@"MyLib" owner:self options:nil] objectAtIndex:0];
    [self.view addSubview:xibView];

现在,例如,loadNibNamed属性应该是? XIB文件的名称?该XIB文件中的视图名称?或者是什么?

所有这些都给我带来了错误,并且应用程序提示了它。

我不知道如何使用XIB文件,因为我是Objective-c编码的新手。

任何帮助都会非常感激!!! 谢谢!

4 个答案:

答案 0 :(得分:4)

XIB,称为NIB(作为历史问题),定义了至少一个由视图控制器“控制”的视图。此视图可以表示整个用户界面,也可以只是另一个视图的子视图(例如,您的XIB可以表示可重复使用的表行)。因此,不应以您描述的方式将XIB用作预构建界面元素的一种容器。

但是,只要控制器知道XIB的组件,就可以很容易地使用它们。也就是说,XIB的元素应该连接到视图控制器类的属性。

例如,假设您有以下视图控制器接口:

#import <UIKit/UIKit.h>

interface MyViewController : UIViewController { 
}

@property (strong, nonatomic) IBOutlet UITextView *textEntry;
@property (strong, nonatomic) IBOutlet UIButton *enterButton;

相应的NIB将命名为MyView.xib。在界面构建器中,您可以将NIB的“文件所有者”设置为“MyViewController”。然后,您可以将界面元素(UITextView和UIButton)链接到MyViewController的属性(以您喜欢的任何方式 - 通常是选项+单击并从界面元素拖动到文件的所有者对象)。

完成此操作后,您可以随意在任何地方实例化视图控制器并使用该对象的属性。例如,让我们假装此代码位于名为“SomeOtherController.m”的文件中:

- (void)aMethodOfSomeOtherController
{
  MyViewController *myView = [[MyViewController alloc] 
                              initWithNibName:@"MyViewController" 
                              bundle:nibBundleOrNil];

  NSString *buttonLabelText = [[[myView] enterButton] titleLabel] text];
  NSLog(@"Button label text = %@", buttonLabelText);

  [myView release];
}

当调用此方法时,将创建MyViewController的实例,该实例将自动从NIB加载存储的对象并将它们绑定到视图控制器对象的属性。然后它将检索按钮标签的文本并将其写入日志控制台。

答案 1 :(得分:2)

如果查看documentation for UIViewController,就会有一个名为initWithNibName:bundle:的方法。它列出了Apple提供的五个不同的示例代码项目,用于演示如何使用xib文件和视图控制器。您应该阅读其中的一些内容以获得基本的理解。

答案 2 :(得分:2)

如果要从NIB加载UIView,则此代码更正确(因为您不知道xib文件中所需对象的索引)。

- (id)loadViewFromNIB:(NSString *)nibName owner:(id)owner class:(Class)_class
{
    NSArray *objects = [[NSBundle mainBundle] loadNibNamed:nibName owner:owner options:nil];

    for (id object in objects) {
        if ([object isKindOfClass:_class]) {
            return object;
        }
    }
}

答案 3 :(得分:-1)

在界面构建器中打开MyLib.xib,并检查该文件中是否确实有UIView组件。

您从异常中获得了什么错误消息?