所以我有一个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
编码的新手。
任何帮助都会非常感激!!! 谢谢!
答案 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组件。
您从异常中获得了什么错误消息?