iOS以内聚的方式添加控件

出发点

每次添加控件都需要addSubview:
其次控件的属性设置、方法经常跨函数,无法快速查找

对比

常规设置

    self.titleLabel = [[UILabel alloc]init];
    self.titleLabel.translatesAutoresizingMaskIntoConstraints = NO;
    self.titleLabel.textColor = [UIColor darkTextColor];
    self.titleLabel.textAlignment = NSTextAlignmentCenter;
    self.titleLabel.font = [UIFont systemFontOfSize:20];
    [self.navView addSubview:self.titleLabel];
    self.titleLabel.hh_centerX = 0;
    self.titleLabel.hh_centerY = 0;
    self.titleLabel.hh_centerYCS.constant = 11;

优化后

    [self.view hh_addLabel:^(UILabel *label) {
        self.label = label;
        label.textColor = [UIColor redColor];
        label.font = [UIFont systemFontOfSize:15];
        label.textAlignment = NSTextAlignmentCenter;
    } constraints:^(MASConstraintMaker *make) {
        make.top.equalTo(self.view).offset(100);
        make.centerX.equalTo(self.view);
    }];

button:方法

    [self.view hh_addButton:^(UIButton *button) {
        self.button = button;
        [button setImage:[UIImage imageNamed:@"action_picture"] forState:UIControlStateNormal];
    } action:^(UIButton *sender) {//button点击事件
        NSLog(@"点击了按钮");
    } constraints:^(MASConstraintMaker *make) {
        make.top.equalTo(self.label).offset(50);
        make.centerX.equalTo(self.view);
    }];

textField:方法


    [self.view hh_addTextField:^(UITextField *textField) {
        self.textField = textField;
        textField.borderStyle = UITextBorderStyleRoundedRect;
        textField.placeholder = @"请输入文字,不超过十个字";
        [textField setValue:[UIColor lightGrayColor] forKeyPath:@"_placeholderLabel.textColor"];
        textField.maxCharacters = 10;//设置最大字数
    } action:^(UITextField *textField, BOOL isOverMax) {//字数改变回调
        NSLog(@"isOverMax==YES,超过了字数限制");
    } constraints:^(MASConstraintMaker *make) {
        make.top.equalTo(self.button.mas_bottom).offset(50);
        make.centerX.equalTo(self.view);
    }];

说明

1、为何第一个属性设置block不需要弱引用,此和masonry等同,并没有对象引用block,属性设置之后就会被释放。
2、action事件以对象的内存地址为key存储在actionDict中,actionblock中需要使用弱引用。当然也可以不用,只需要打破环路即可,把视图的actionDict置为nil即可,详见Demo。在基类调用如下函数:

- (void)viewDidDisappear:(BOOL)animated
{
    [super viewDidDisappear:animated];
    if (!self.navigationController.topViewController)///过滤非销毁的视图,如push进来的上层界面
    [self enumSubViewsTree:self.view];
}
- (void)enumSubViewsTree:(UIView *)view
{//递归遍历子控件,把存有block的actionDict置为nil
    if (view.actionDict) view.actionDict = nil;
    for (UIView *subV in view.subviews)[self enumSubViewsTree:subV];
}

3、此分类包含了常用的控件,需要依赖第三方框架masonry
4、之所以为务虚篇,是因为此分类并没有改变实际的代码量,只是以高内聚的形式展示,聚合了属性,事件以及约束。

下载地址:Demo地址

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 176,428评论 25 709
  • 小时候,村里面都是四合宅院,从我家穿过门前的胡同一直往南走,走到胡同尽头,有一颗歪脖子大槐树,树已经被虫子蛀的不成...
    张锋字东海阅读 3,369评论 0 0

友情链接更多精彩内容