可以说,在给定的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/