【问题标题】:Objective-c - Getting objects from XIB file into a view controllerObjective-c - 从 XIB 文件中获取对象到视图控制器中
【发布时间】:2012-10-31 21:13:37
【问题描述】:

所以我有一个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 文件。

任何帮助将不胜感激!!! 谢谢!

【问题讨论】:

    标签: iphone objective-c xib viewcontroller


    【解决方案1】:

    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 的属性(以您喜欢的任何方法 - 通常是选项+单击并从界面元素拖动到 File's Owner 对象)。

    完成此操作后,您可以在任何您喜欢的地方实例化视图控制器并使用该对象的属性。例如,假设这段代码在名为“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 加载存储的对象并将它们绑定到视图控制器对象的属性。然后它将检索按钮标签的文本并将其写入日志控制台。

    【讨论】:

    • 哇,感谢您这么好的解释并花时间这样做=)
    【解决方案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】:

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

      【讨论】:

        【解决方案4】:

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

        你从异常中得到什么错误信息?

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-06-14
          • 1970-01-01
          • 2014-02-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多