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

如何在一行代码中向iOS视图添加多个子视图?(可能通过“monkeypatching”一个`addSubviews'实例方法到UIView?)

  •  1
  • boulder_ruby  · 技术社区  · 11 年前

    就说我只有一个 UILabel 子视图元素&一 UITextView 给定ViewController.m的子视图元素 viewDidLoad 方法如下:

    UILabel *name = [[UILabel alloc] initWithFrame:CGRectMake(20, 140, 280, 40)];
    name.text = @"Name: Eric";
    UITextView *bio = [[UITextView alloc] initWithFrame:CGRectMake(20, 190, 280, 80)];
    bio.text = "Contrary to popular belief, Lorem Ipsum is not simply random text. It has roots in a piece of classical Latin literature fro...";
    

    按照正常方式,我可以一次添加一个:

    [self.view addSubview:name];
    [self.view addSubview:bio];
    

    但是,如果有几十个或数百个UI组件,每次添加一个,将为我的项目添加几十到数百行代码。

    来自红宝石背景,我认为简洁非常重要。是否有任何方法可以像这样将UI元素作为数组传递?:

    [self.view addSubviews:@[name, bio]];
    

    对我来说,在启动时开始修补iOS的库可能有点早,但这绝对是我可以接受的解决方案。

    我想知道,从ruby/rails的理解模板中,是否有类似Rail的东西 /initializers iOS应用程序中的文件夹?仅供参考,非/预轨人员 /初始化程序 rails中的文件夹在任何rails会话开始时都会被rails扫描 .rb 文件是在加载rails中的任何其他文件之前执行的,而依赖关系库是在此之前加载的。因此 ActiveRecord 例如,gem(库)可以在初始值设定项中重新实例化,然后修改为。我知道目标C在很多情况下是不可变的,但不知道这是否会有问题。

    现有的Cocoa库方法当然是首选。

    在ruby中,我可能会将该方法补丁到UIViewController,可能会有点像这样:

    class UIViewController
      def addSubviews(subviews)
        subviews.each {|obj| self.view.addSubview(obj) }
      end
    end
    
    2 回复  |  直到 11 年前
        1
  •  2
  •   Eric    11 年前

    我会去 category 在…上 UIView .

    文件-->新建-->文件-->Objective-C类别。将其命名为 EasyAdditionOfSubviews ,使其成为上的类别 UI视图 .

    UIView+EasyAdditionOfSubviews.h

    #import <UIKit/UIKit.h>
    
    @interface UIView (EasyAdditionOfSubviews)
    
    - (void)addSubviews:(NSArray *)views;
    
    @end
    

    UIView+EasyAdditionOfSubviews.m

    #import "UIView+EasyAdditionOfSubviews.h"
    
    @implementation UIView (EasyAdditionOfSubviews)
    
    - (void)addSubviews:(NSArray *)views
    {
        for (UIView *view in views) {
            if ([view isKindOfClass:[UIView class]]) {
                [self addSubview:view];
            }
        }
    }
    
    @end
    

    这边,你只是 #import UIView+EasyAdditionOfSubviews.h 任何您想一次添加视图数组的位置。

    你最好确保你传递给 addSubview: 确实是 UI视图 ,否则您将面临崩溃的风险(例如,尝试将其传递给 NSArray ).

    但为了解决您更广泛的担忧:

    但是如果有几十个或者可能几百个UI组件, 每次添加一行,将增加数十到数百行 的代码添加到我的项目。

    如果您是以编程方式构建UI,则需要确切地确定向视图添加子视图的内容、方式和时间;在向视图中添加子视图时,显式是非常好的。

    事实上,不将子视图显式添加到其超视图的解决方法是…显式将其添加到数组,然后再将其添加至超视图。不利于简洁!

        2
  •  1
  •   Dave Wood    11 年前

    假设子视图是一个数组,您可以执行以下操作:

    [subViews enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
        [superview addSubview:obj];
    }];
    

    正如@pranav提到的,另一种方法是使用for。。在语法中:

    for (UIView* view in subViews) {
        [superview addSubview:view];
    }