如何在一行代码中将多个子视图添加到我的iOS视图? (通过“猴子修补”一个'广告Subviews`实例方法或许是UIView?)

时间:2014-02-23 03:16:31

标签: ios cocoa subview addsubview monkeypatching

我只想说我只有一个UILabel子视图元素&给定ViewController.m的UITextView方法中的一个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模板的理解,我想知道,在iOS应用程序中是否有与Rail的/initializers文件夹相同的东西? FYI非/ pre-rails人员,rails中的/initializers文件夹在任何rails会话开始时由rails扫描,其.rb文件中的所有代码在rails之前的任何其他内容被执行之前执行来自之前加载的依赖库。因此,例如ActiveRecord gem(库)可以在初始化程序中重新实例化,并在此时进行修改。我知道Objective C在很多情况下是不可变的,但不知道这是不是一个问题。

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

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

class UIViewController
  def addSubviews(subviews)
    subviews.each {|obj| self.view.addSubview(obj) }
  end
end

2 个答案:

答案 0 :(得分:2)

我会在UIView上找category

档案 - >新 - >档案 - > Objective-C类别。将其命名为EasyAdditionOfSubviews,将其设为UIView上的类别。

<强>的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:的内容确实是UIView,否则可能会导致崩溃(例如,尝试将其传递给NSArray )。

但要解决你更广泛的担忧:

  

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

如果您以编程方式构建UI,则需要确切地确定将子视图添加到视图中的内容,方式和时间;在向视图添加子视图时要明确是完全正确的。

事实上,未明确将子视图添加到其超级视图的解决方法是......将其显式添加到数组中,然后将其添加到超级视图中。不太简洁!

答案 1 :(得分:1)

假设subViews是一个数组,你可以这样做:

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

正如@pranav所提到的,另一种方法是使用for..in语法:

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