【问题标题】:Reuse of code-based UIViews compared with XIBs与 XIB 相比,基于代码的 UIView 的重用
【发布时间】:2011-06-21 20:13:46
【问题描述】:

假设我有一个 UIView,我想在多个视图控制器中重用它,因为它是一个相当通用的 UIView 对象,具有很高的重用价值(如 UITextFieldUISegmentedControl 对象)。根据我的理解,如果我在代码中编写 UIView,而不是使用 Interface Builder 制作 XIB,那么重用这个 UIView 会容易得多。我得出了这个结论,因为如果 UIView 是用代码编写的,那么我可以简单地在任何视图控制器中初始化该 UIView 的新实例:

MyGreatReusableView *greatReusableView = [[MyGreatReusableView alloc] initWithFrame:CGRectMake(...)];

...然后直接访问该 UIView 的属性和属性,就像使用股票 UIView 控件(例如 UITextField 与它的 .text.textColor 等属性一样)。

但是,如果我将 UIView 创建为 XIB,则它必须(通过文件所有者或 XIB 中视图对象上的 IBOutlet)绑定到特定视图控制器,因此只能在该视图中使用控制器。此外,我只能使用连接到该视图控制器的 IBOutlets 访问 XIB 上控件的属性。

我认为我完全误解了关于 XIB 文件的一些内容,因为这似乎是一个相当大的限制!如果有人可以澄清是否可以在多个视图控制器中重用 XIB 文件,如果可以,请提供基于代码的解决方案与基于 XIB 的解决方案的示例,我将非常感激。

提前感谢您的帮助!

【问题讨论】:

    标签: iphone uiview uikit interface-builder xib


    【解决方案1】:

    无需设置可重用视图的 IBOutlets 的替代解决方案是通过指定要使用特定标签的子视图。然后就可以通过标签获取视图了。

    例如,当您要创建带有标签和文本字段的视图时。这样做的过程是:

    1. 创建一个空的xib
    2. 将带有标签和文本字段的视图设置为子视图。
    3. 为标签和文本字段分配不同的标签(比如 10 和 11)

    4. 为此 xib 创建头文件并为标签定义宏
      #define kReusableViewNibName @"ReusableViewNibName"
      #define kLabelTag 10
      #define kTextFieldTag 11

    5. 您现在可以在任何您想要的视图控制器中加载 xib:

    
    // Import header file with previous defines
    
    NSArray *rootViewsFromXib = [[NSBundle mainBundle] loadNibNamed:@"NameOfXib"
                                                              owner:nil
                                                            options:nil];
    
    // There is only one root view in the xib,
    // the view that contains the label and text field
    UIView *loadedView = [rootViewsFromXib objectAtIndex:0];
    
    // You can now use the views from within the xib
    // by using the tags to obtain the views.
    UILabel *label = (UILabel *)[loadedView viewWithTag:kLabelTag];
    UITextField *textField = (UITextField *)[loadedView viewWithTag:kTextFieldTag];
    
    

    【讨论】:

      【解决方案2】:

      确实可以在多个视图控制器中使用同一个视图。你走在正确的轨道上。关键是您不必使用与视图绑定的视图控制器。这是我为可重复使用的表格单元格(包含滑块之类的东西)所做的事情

      1. 创建一个新的 XIB 文件
      2. 创建一个新视图(在我的例子中,这是一个表格单元格)
      3. 将 UIViewController.view 设置为视图(同样是表格单元格)
      4. 我将它与这段代码(目前在生产中使用)挂钩: @implementation TableCellFactory +(UITableViewCell*) createCellInstanceFromXIBName:(NSString*)name { UIViewController* tmp = [[UIViewController alloc] initWithNibName:name bundle:nil]; UITableViewCell* cell = (UITableViewCell*)[tmp view]; DebugAssert([[cell class] isSubclassOfClass:[UITableViewCell class]], @"XIB view cell is not a subclass of UITableViewCell; xib name:%@",name); DebugAssert(cell != nil,@"cell is nil -- Xib name:%@",name); [cell retain]; [tmp release]; return cell; } @end

      【讨论】:

      • 感谢您的留言。我是否正确,您正在创建一个视图控制器,然后将该控制器上的视图出口设置为您的 XIB 视图,以便您可以在代码中访问视图控制器 .view 属性?换句话说,视图控制器本身什么都不做?我只是担心这似乎不是一个非常优雅或高效的解决方案,因为在代码中创建 UIView 意味着我可以直接初始化 UIView 而不必通过使用 UIViewController 的开销。
      • 这是正确的。由于最低限度的低效率,我不会失去任何睡眠——这不是需要优化的紧凑代码路径(至少在我的代码中)。我相信这也是苹果推荐的方式。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-12-21
      • 1970-01-01
      • 2013-03-06
      • 2012-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多