-1

所以我有一个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文件中的视图名称?或者是什么?

所有这些都给我带来了错误,并且应用程序出现了异常。

Objective-c因为我对编码超级陌生,所以我不知道如何使用 XIB 文件。

任何帮助将非常感激!!!谢谢!

4

4 回答 4

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 加载存储的对象并将它们绑定到视图控制器对象的属性。然后它将检索按钮标签的文本并将其写入日志控制台。

于 2012-11-12T13:40:03.070 回答
2

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

于 2012-11-12T12:44:03.237 回答
2

如果您想UIView从 NIB 加载,此代码会更正确(因为您不知道 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;
        }
    }
}
于 2012-11-12T12:47:52.720 回答
-1

在界面生成器中打开 MyLib.xib 并检查您在该文件中是否确实有一个 UIView 组件。

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

于 2012-11-12T13:02:26.110 回答