可以说,在给定的ViewController.m的UILabel方法中,我只有一个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文件夹?仅供参考,在所有Rails会话开始时,Rails都会对rails中的/initializers文件夹进行扫描,并且在其.rb文件中的所有代码都将在依赖库之外加载rails中的任何其他文件之前执行在此之前加载的。因此,例如,可以在初始化程序中重新实例化ActiveRecord宝石(库),并在此时进行修改。我知道,Objective C在很多情况下是不可变的,并且不知道这是否会成为问题。

现有的可可库方法当然是优选的。

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

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

最佳答案

我想在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,则需要完全确定将子视图添加到视图的方式,方式和时间。在将子视图添加到视图时明确显示是完全可以的。

实际上,不将子视图显式添加到其父视图的解决方法是...显式将其添加到数组,然后将其添加到父视图。简洁不是很好!

关于ios - 如何在一行代码中将多个 subview 添加到我的iOS View 中? (也许通过“猴子补丁”将“ad Subviews”实例方法添加到UIView?),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21963747/

10-12 12:39
查看更多