通过Xib自定义控件
1.IBAction和IBOutlet共同的和区别2.常见错误3.UIButton4.UILabel5.父子控件6.UIView常见属性7.渐变动画8.懒加载
9.通过Xib自定义控件
10.自定义控件11.@property的使用策略12.instancetype和id的区别13.帧动画14.UIImageView15.MemoryLayout16.偏swift框架17.git的使用18.寄存器19.swift基础20.枚举21.UITableView22.UITableViewCell23.UITableView24.UIScrollView遇见的问题25.NSTimer26.常见控件的事件监听27.UIScrollView28.图片拉伸29.KVO30.KVC31.Xcode15.0.1 有相同的.h文件,Xcode的调用顺序加载xib的两种方式
- NSArray *array = [[NSBundle mainBundle] loadNibNamed:@"test" owner:nil options:nil];
-
UINib *nib = [UINib nibWithNibName:@"Test" bundle:nil]; // nil 默认是mainBundle
NSArray *array = [nib instantiteWithOwer:nil object:nil];
控制器拿到xib中控件的方法:
- 遍历所有的子控件
// 直接遍历子控件设置数据 for (UIView *view in shopView.subviews) { if ([view isKindOfClass:[UIImageView class]]) { UIImageView *imageView = (UIImageView *)view; imageView.image = [UIImage imageNamed:shop.icon]; } else if ([view isKindOfClass:[UILabel class]]) { UILabel *label = (UILabel *)view; label.text = shop.name; } }
- 绑定tag
// 通过tag拿到对应的子控件设置数据 UIImageView *iconImageView = (UIImageView *)[shopView viewWithTag:1]; iconImageView.image = [UIImage imageNamed:shop.icon]; UILabel *nameLabel = (UILabel *)[shopView viewWithTag:2]; nameLabel.text = shop.name;
自定义xib的步骤:
- 创建一个ShopView,xib和其文件名保持一致(名字随便取,建议有意义一点)
- 在Xib中,xib的类从UIView改成ShopView
- 给内部的子控件设置数据
- 提供类方法封装xib的加载过程
+ (instancetype)shopView { return [[[NSBundle mainBundle] loadNibNamed:NSStringFromClass(self) owner:nil options:nil] lastObject]; } + (instancetype)shopViewWithShop:(Shop *)shop { //创建shopView
ShopView *shopView = [self shopView];
//给shopView设置数据 shopView.shop = shop; return shopView; }
xib的加载原理
- 一层一层的解析转为对应的代码
- (void)loadXib { XMGShopView *shopView = [[XMGShopView alloc] initWithCoder:nil]; shopView.frame = CGRectMake(0, 0, 70, 90); shopView.backgroundColor = [UIColor whiteColor]; UIImageView *iconImageView = [[UIImageView alloc] initWithCoder:nil]; iconImageView.backgroundColor = [UIColor greenColor]; iconImageView.frame = CGRectMake(0, 0, 70, 70); [shopView addSubview:iconImageView]; self.iconImageView = iconImageView; XMGLabel *nameLabel = [[XMGLabel alloc] initWithCoder:nil]; nameLabel.backgroundColor = [UIColor greenColor]; nameLabel.frame = CGRectMake(0, 0, 70, 70); [shopView addSubview:nameLabel]; self.nameLabel = nameLabel; }
- xib中的控件是什么类型,加载出来就是什么类型
- xib中的子控件是什么类型,脱线出来就是什么类型
- 通过alloc/init或者alloc/initWithFrame创建控件不会主动加载xib,即使xib的名称和控件的类名一样
注意点:
- 如果是通过代码创建的控件,初始化时一定会调用initWithFrame
- 如果是通过xib或者storyboard创建控件,初始化时是不会调用initWithFrame,会调用initWithCoder
- 如果是通过xib或者storyboard创建控件,初始化完毕后会调用awakeFromNib方法
- 建议在awakeFromNib中做初始化
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战