我只想说我只有一个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
答案 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];
}