ios通过xib创建控件

之前写过ios动态创建控件及添加事件,纯手工代码写控件,虽然比较灵活,但是就是代码量比较多。这次我们通过xib来创建app下载列表项 AppView.xib。一个imageview,一个label,一个button构成

1.创建AppView.xib

2.再创建xib对应的mode,AppView.h 继承至UIView

实现效果如下:

3.xib页面设计好了之后,将控件拖入AppView.h

objectivec 复制代码
//
//  AppView.h
//  iosstudy2024
//
//  Created by figo on 2025/2/10.
//

#import <UIKit/UIKit.h>

NS_ASSUME_NONNULL_BEGIN

@interface AppView : UIView
@property (weak, nonatomic) IBOutlet UIImageView *iconImg;
@property (weak, nonatomic) IBOutlet UILabel *appName;
@property (weak, nonatomic) IBOutlet UIButton *btnDownload;

@end

NS_ASSUME_NONNULL_END

4.列表配置文件icons.plist

XML 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<array>
	<dict>
		<key>name</key>
		<string>deepseek</string>
		<key>icon</key>
		<string>diamond</string>
	</dict>
	<dict>
		<key>name</key>
		<string>文心一言</string>
		<key>icon</key>
		<string>star</string>
	</dict>
	<dict>
		<key>name</key>
		<string>豆包</string>
		<key>icon</key>
		<string>grape</string>
	</dict>
	<dict>
		<key>name</key>
		<string>deepseek</string>
		<key>icon</key>
		<string>watermenon</string>
	</dict>
	<dict>
		<key>name</key>
		<string>deepseek</string>
		<key>icon</key>
		<string>diamond</string>
	</dict>
	<dict>
		<key>name</key>
		<string>deepseek</string>
		<key>icon</key>
		<string>diamond</string>
	</dict>
	<dict>
		<key>name</key>
		<string>deepseek</string>
		<key>icon</key>
		<string>diamond</string>
	</dict>
	<dict>
		<key>name</key>
		<string>deepseek</string>
		<key>icon</key>
		<string>diamond</string>
	</dict>
	<dict>
		<key>name</key>
		<string>deepseek</string>
		<key>icon</key>
		<string>diamond</string>
	</dict>
</array>
</plist>

5.添加控制器AppDownloadViewController.m

objectivec 复制代码
//
//  AppDownloadViewController.m
//  iosstudy2024
//
//  Created by figo on 2025/2/10.
//

#import "AppDownloadViewController.h"
#import "AppView.h"
@interface AppDownloadViewController ()
@property (nonatomic,strong) NSArray *iconArray;

@end

@implementation AppDownloadViewController
- (NSArray *)iconArray{
    if(_iconArray==nil){
        NSString *path=[[NSBundle mainBundle]pathForResource:@"icons.plist" ofType:nil];
        _iconArray=[NSArray arrayWithContentsOfFile:path];
    }
    return _iconArray;
}

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    //[self initApp];
    [self initAppUseXib];
    
    
}

-(void) initApp{
    // Do any additional setup after loading the view from its nib.
       NSUInteger count=self.iconArray.count;
       NSBundle *boundle=[NSBundle mainBundle];
       for(int a=0;a<count;a++){
           //添加外边框
           UIView *uiView=[UIView new];//new的方式
   
           uiView.backgroundColor=[UIColor blueColor];
           CGFloat x=50+(a%3)*(75+10);
           CGFloat y=50+(a/3)*(100+10);
           uiView.frame=CGRectMake(x, y, 75, 100);//x,y,w,h
           
           //外边框内部添加图片
           UIImageView *uiImageView=[UIImageView new];
           uiImageView.backgroundColor=[UIColor greenColor];
           CGFloat iconW=45;
           CGFloat iconH=45;
           CGFloat x1=(uiView.frame.size.width-iconW)*0.5;//相对坐标
           CGFloat y1=0;//相对坐标
           uiImageView.frame=CGRectMake(x1, y1, iconW, iconH);//x,y,w,h
           NSDictionary *dictionary=self.iconArray[a];
   //        NSString *imgPath = [NSString stringWithFormat:@"%@/%@.jpg", [[NSBundle mainBundle] resourcePath], dictionary[@"icon"]];
           NSString *imgPath=[[NSBundle mainBundle]pathForResource:dictionary[@"icon"] ofType:@".jpeg"];
           //照片拖入Assets.xcassets文件夹会找不到资源,注意需要项目下新建group命名为Supporting Files,再项目外新建文件夹比如icons,然后将图片放入icons,再将icons文件夹拖入Supporting Files才能找到,否则返回nil
           UIImage *uiImage=[UIImage imageWithContentsOfFile:imgPath];//imageWithContentsOfFile不会缓存,每次都重新加载图片
//           UIImage *uiImage=[UIImage imageNamed:dictionary[@"icon"]];//imageNamed会缓存,照片拖入Assets.xcassets文件夹即可,图片非常多,会占用很多内存
    
           uiImageView.image=uiImage;
           [uiView addSubview:uiImageView];
           
           //外边框内部标题
           UILabel *uiLabel=[UILabel new];
           uiLabel.backgroundColor=[UIColor yellowColor];
           CGFloat labelW=uiView.frame.size.width;
           CGFloat labelH=20;
           CGFloat x2=0;//相对坐标
           CGFloat y2=uiImageView.frame.size.height+5;//相对坐标
           uiLabel.frame=CGRectMake(x2, y2, labelW, labelH);//x,y,w,h
           uiLabel.text=dictionary[@"name"];
           [uiLabel setTextAlignment:NSTextAlignmentCenter];
           [uiView addSubview:uiLabel];
           
           
           //外边框内部添加按钮
           UIButton *uiButton=[UIButton new];
           uiButton.backgroundColor=[UIColor redColor];
           CGFloat buttonW=55;
           CGFloat buttonH=20;
           CGFloat x3=(75-55)*0.5;//相对坐标
           CGFloat y3=uiImageView.frame.size.height+uiLabel.frame.size.height+5+5;//相对坐标
           uiButton.frame=CGRectMake(x3, y3, buttonW, buttonH);//x,y,w,h
           [uiButton setTitle:@"下载" forState:UIControlStateNormal];
           [uiButton addTarget:self action:@selector(onclick:) forControlEvents:UIControlEventTouchUpInside];
           uiButton.tag=a;
           [uiView addSubview:uiButton];
           
           [self.view addSubview:uiView];
    
       }
}


-(void) initAppUseXib{
    // Do any additional setup after loading the view from its nib.
       NSUInteger count=self.iconArray.count;
       NSBundle *boundle=[NSBundle mainBundle];
       for(int a=0;a<count;a++){
           //添加外边框
           //通过xib文件获取的方式
           AppView *uiView=[[boundle loadNibNamed:@"AppView" owner:nil options:nil]lastObject];
           uiView.backgroundColor=[UIColor purpleColor];
           CGFloat x=50+(a%3)*(75+10);
           CGFloat y=50+(a/3)*(100+10);
           uiView.frame=CGRectMake(x, y, 75, 100);//x,y,w,h
           
           //外边框内部添加图片
           uiView.iconImg.backgroundColor=[UIColor greenColor];
           NSDictionary *dictionary=self.iconArray[a];
           NSString *imgPath=[[NSBundle mainBundle]pathForResource:dictionary[@"icon"] ofType:@".png"];
           //照片拖入Assets.xcassets文件夹会找不到资源,注意需要项目下新建group命名为Supporting Files,再项目外新建文件夹比如icons,然后将图片放入icons,再将icons文件夹拖入Supporting Files才能找到,否则返回nil
           UIImage *uiImage=[UIImage imageWithContentsOfFile:imgPath];//imageWithContentsOfFile不会缓存,每次都重新加载图片
//           UIImage *uiImage=[UIImage imageNamed:dictionary[@"icon"]];//imageNamed会缓存,照片拖入Assets.xcassets文件夹即可,图片非常多,会占用很多内存
           uiView.iconImg.image=uiImage;
           
           //外边框内部标题
           uiView.appName.backgroundColor=[UIColor yellowColor];
           uiView.appName.text=dictionary[@"name"];
           [uiView.btnDownload addTarget:self action:@selector(onclick:) forControlEvents:UIControlEventTouchUpInside];
           uiView.btnDownload.tag=a;
           [self.view addSubview:uiView];
    
       }
}

-(void)onclick:(UIButton *)uiButton{
    NSLog(@"%d点击下载",uiButton.tag);
}
@end

6.SceneDelegate.m修改当前controller为AppDownloadViewController

objectivec 复制代码
- (void)scene:(UIScene *)scene willConnectToSession:(UISceneSession *)session options:(UISceneConnectionOptions *)connectionOptions {
 
    AppDownloadViewController * viewController = [[AppDownloadViewController alloc]init];
    self.window.rootViewController=viewController;
}
相关推荐
2501_9044477421 小时前
曝苹果2026年秋季推首款折叠iPhone
智能手机·django·objective-c·pygame·tornado
安和昂1 天前
effective—Objective—C 第七章阅读笔记
笔记·objective-c
安和昂7 天前
effective-Objective-C 第五章学习笔记
笔记·学习·objective-c
一丝晨光8 天前
如何构建ObjC语言编译环境?构建无比简洁的clang编译ObjC环境?Windows搭建Swift语言编译环境?
linux·c语言·开发语言·windows·macos·objective-c·clang
一丝晨光8 天前
为什么会有函数调用参数带标签的写法?Swift函数调用的参数传递需要加前缀是否是冗余?函数调用?函数参数?
java·开发语言·c++·ios·c#·objective-c·swift
小鹿撞出了脑震荡9 天前
Effective Objective-C 2.0 读书笔记—— 接口与API设计
开发语言·ios·objective-c
小鹿撞出了脑震荡9 天前
Effective Objective-C 2.0 读书笔记——类对象
开发语言·ios·objective-c
小鹿撞出了脑震荡13 天前
Effective Objective-C 2.0 读书笔记—— 方法调配(method swizzling)
ios·objective-c·swift
小鹿撞出了脑震荡13 天前
Effective Objective-C 2.0 读书笔记—— 消息转发
ios·objective-c·swift