【问题标题】:Best way to access subviews of views instantiated from XIB?访问从 XIB 实例化的视图子视图的最佳方式?
【发布时间】:2014-10-24 22:35:41
【问题描述】:

我正在从 XIB 实例化多个克隆视图,如下所示:

UIView *view = [[NSBundle mainBundle] loadNibNamed:@"MyNib" owner:self options:nil][0];

然后我需要访问每个视图的子视图(例如,更改标签)。 在这里用 IBOutlet 连接一个元素是行不通的(因为引用会被重写,但最近的视图会被实例化)。

这是迄今为止我最好的尝试:

for (UIView *subview in myView.subviews) {
    if ([subview.restorationIdentifier isEqualToString:@"myTargetElement"]) {
        // do something with the view
        break;
    }
}

所以我基本上是通过子视图迭代以通过 restoreIdentifier 找到我的元素。我想知道是否有一种方法可以在不迭代的情况下获得直接引用?

【问题讨论】:

    标签: ios ios7 uiview xib ios8


    【解决方案1】:

    插座引用有什么问题?我认为它会工作得一样好。
    关键在于您如何进行点引用。

    例子:

    UIView *view = [[NSBundle mainBundle] loadNibNamed:@"MyNib" owner:self options:nil][0];
    //...
    UIView *view_1 = [[NSBundle mainBundle] loadNibNamed:@"MyNib" owner:self options:nil][0];
    //...
    [view.someLabel setText:@"1"];
    [view_1.someLabel setText:@"2"];
    

    无论如何...或者,您可以给subviews 一个特定的标签并通过-viewWithTag: 方法访问它们。

    例子:

    说你的这个'MyNib'中的UILabel有一个标签100,那么你可以通过以下方式引用它:

    [view viewWithTag:100];
    
    //like so:
    //UILabel *lblTemp = [view viewWithTag:100];
    //[lblTemp setText:@"NewText"];
    

    【讨论】:

      【解决方案2】:

      您可以使用 IBOutlets。不过,它们需要用于自定义视图子类,而不是用于添加视图的视图控制器。像这样的东西很好用,

      #import "ViewController.h"
      #import "RDView.h"
      
      @implementation ViewController
      
      - (void)viewDidLoad
      {
          [super viewDidLoad];
          RDView *view = [[NSBundle mainBundle] loadNibNamed:@"RDView" owner:self options:nil][0];
          [self.view addSubview:view];
          view.topLabel.text = @"Hello";
          view.bottomLabel.text = @"Goodbye";
      }
      

      【讨论】:

        猜你喜欢
        • 2014-12-17
        • 2014-02-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多