代码之家  ›  专栏  ›  技术社区  ›  fuzzygoat

从XIB中提取UI项目?

  •  2
  • fuzzygoat  · 技术社区  · 15 年前

    在对文档进行了一番搜索之后,我决定使用“viewWithTag”从loadNibName返回的主根视图中提取子视图:owner:options:to start with我有点困惑,因为我假设loadNibName:owner:options会在事实上,它似乎返回根视图(或根视图)。谁能证实我做得对,我只是好奇,是否还有其他(也许更好)的方法来提取和设置一个文件中的项目?

    - (void)loadView {
        NSLog(@"HYBRID UI: %s", __PRETTY_FUNCTION__);
        NSArray *nibArchive = [[NSBundle mainBundle] loadNibNamed:@"Interface" owner:self options:nil];
        NSLog(@"SIZE: %d ARRAY: %@", [nibArchive count], nibArchive);
    
        // UIView
        UIView *nibView = [nibArchive lastObject];
        [nibView setFrame:[[UIScreen mainScreen] applicationFrame]];
        NSLog(@"FRAME: %@", NSStringFromCGRect([nibView frame]));
        [self setView: nibView];
    
        // UILabel
        UILabel *nibLabel = (UILabel *)[nibView viewWithTag:101];
        [nibLabel setText:@"FRINGE"];
        [nibLabel setTextColor:[UIColor whiteColor]];
    
        // UIImageView
        UIImageView *nibImageView = (UIImageView *)[nibView viewWithTag:102];
        [nibImageView setBackgroundColor:[UIColor whiteColor]];
    }
    

    加里干杯

    2 回复  |  直到 15 年前
        1
  •  3
  •   Ole Begemann    15 年前

    loadNibNamed:owner:options: 返回一个数组 笔尖中的对象。要访问层次结构中的其他对象,可以手动遍历层次结构(在大多数情况下不是一个好主意)、像使用outlet那样使用标记。

    如果您在视图控制器中声明视图、标签和图像视图的出口,并在NIB中将它们连接到适当的对象,它们将自动连接到 loadNibNamed:owner:选项: .

    PS:你为什么要手动加载笔尖?不能用 initWithNibName:bundle 并在中执行其余初始化 viewDidLoad ?

        2
  •  2
  •   Brian    15 年前

    你好像把事情弄得比需要的更难了。如果你是UIViewController的子类,只要调用 [super initWithNibName:@"whatever" bundle:nil] 在你的 init ,那你就不用打电话了 loadNibNamed:owner:options 你自己。既然你用的是笔尖,你应该把代码放进去 viewDidLoad 不执行 loadView .

    在界面中,为您感兴趣的视图设置IBOutlet:

    @property (nonatomic, retain) IBOutlet UILabel *titleLabel;
    

    在nib中,将文件的Owner类设置为UIViewController子类,然后可以将titleLabel连接到实际的UILabel。