前言:
最近在学习iOS 主要学习的还是 oc语言和xib的使用 那么废话不多说。正式开始
效果图:
具体实现 :
-
1 底部导航实现:
UITabBarController *tabVC = [[UITabBarController alloc]init];
HomeController * homecontroller =[[HomeController alloc] init];
CompanyController * companyController= [[CompanyController alloc] init];
MessageController* messageController= [[MessageController alloc]init];
MyController * myController= [[MyController alloc]init];
homecontroller.title = @"职位"; //导航栏文字
homecontroller.tabBarItem.title = @"职位"; //tab文字
homecontroller.tabBarItem.image = [UIImage systemImageNamed:@"icon.bundle/[email protected]"]; //默认图片
homecontroller.tabBarItem.selectedImage = [UIImage systemImageNamed:@"icon.bundle/[email protected]"]; //选中图片
companyController.title = @"公司"; //导航栏文字
companyController.tabBarItem.title = @"公司"; //tab文字
companyController.tabBarItem.image = [UIImage systemImageNamed:@"icon.bundle/[email protected]"]; //默认图片
companyController.tabBarItem.selectedImage = [UIImage systemImageNamed:@"icon.bundle/[email protected]"]; //选中图片
messageController.title = @"消息"; //导航栏文字
messageController.tabBarItem.title = @"消息"; //tab文字
messageController.tabBarItem.image = [UIImage systemImageNamed:@"icon.bundle/[email protected]"]; //默认图片
messageController.tabBarItem.selectedImage = [UIImage systemImageNamed:@"icon.bundle/[email protected]"]; //选中图片
myController.title = @"我的"; //导航栏文字
myController.tabBarItem.title = @"我的"; //tab文字
myController.tabBarItem.image = [UIImage systemImageNamed:@"icon.bundle/[email protected]"]; //默认图片
myController.tabBarItem.selectedImage = [UIImage systemImageNamed:@"icon.bundle/[email protected]"]; //选中图片
[tabVC setViewControllers:@[homecontroller,companyController,messageController,myController]];
//UINavigationController * navigationController= [[UINavigationController alloc] initWithRootViewController:tabVC];
self.window.rootViewController = tabVC;
[self.window makeKeyAndVisible];
我们这里用了 UITabBarController 这个底部导航控件来处理底部导航的 然后我们写了3个viewcontroller 分别来展示我们的 职位模块 公司模块 消息模块 个人中心模块
-
职位模块
//
// HomeController.m
// bosstab
//
// Created by xuqing on 2021/2/21.
//
#import "HomeController.h"
#import "GTListLoader.h"
#import "HomeViewCell.h"
@interface HomeController ()
@property(nonatomic,strong,readwrite)UITableView * tableview;
@property(nonatomic,strong,readwrite)NSArray * dataArray;
@property(nonatomic,strong,readwrite)GTListLoader * listLoader;
@end
@implementation HomeController
- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor= [UIColor whiteColor];
_tableview=[[UITableView alloc]initWithFrame:self.view.bounds];
_tableview.dataSource=self;
_tableview.delegate=self;
[self.view addSubview:_tableview];
self.listLoader= [[GTListLoader alloc]init];
__weak typeof(self)wself= self; //除了self 重复引用
[self.listLoader loadListDataWithFinishBlock:^(BOOL success, NSArray * _Nonnull dataArray) {
__strong typeof (wself)strongSelf=wself;
NSLog(@"");
strongSelf.dataArray=dataArray;
[strongSelf.tableview reloadData];
}];
}
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath{
return 120 ;
}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
NSLog(@"%ld", indexPath.row);
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
return _dataArray.count;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
// HomeTableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:@"id"];
// if(!cell){
// cell =[[HomeTableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle
// reuseIdentifier:@"id"];
// }
//
HomeViewCell * cell = [tableView dequeueReusableCellWithIdentifier:@"HomeViewCell"];
if (!cell)
{
//xib 上 cell 不会自动加载 ;
//应用程序束:获得工程中所有的资源的路径
//获得指定的 xib 中所有的视图
NSArray * array = [[NSBundle mainBundle]loadNibNamed:@"HomeViewCell" owner:nil options:nil];
//从数组中找到对应的 cell ( xib 上只有 cell 一个视图)
// cell = [array lastObject];
for (id object in array)
{
//如果 object 是 ZYTableViewCell 类型,就找到了
if ( [object isKindOfClass:[HomeViewCell class]])
{
cell = object ;
break ;
}
}
}
[cell layoutTableViewCellWithItem:[self.dataArray objectAtIndex:indexPath.row]];
return cell;
}
@end
我们通过 UITableView 来展示我们的列表信息 然后我们封装了一个网络请求的方法
来请求我们本地服务器的的接口
self.listLoader= [[GTListLoader alloc]init];
__weak typeof(self)wself= self; //除了self 重复引用
[self.listLoader loadListDataWithFinishBlock:^(BOOL success, NSArray * _Nonnull dataArray) {
__strong typeof (wself)strongSelf=wself;
NSLog(@"");
strongSelf.dataArray=dataArray;
[strongSelf.tableview reloadData];
}];
这边通过我们调用了 loadListDataWithFinishBlock 方法后 然后通过block 回调将我们请求回来的json转成 NSArray 回调回来
-
网络请求
- (void)loadListDataWithFinishBlock:(GTListLoaderPositionFinishBlock)finishBlock{
NSString *urlString = @"http://192.168.7.25:8090/boss/position/getpositioninfo";
NSURL *listURL = [NSURL URLWithString:urlString];
__weak typeof(self)weakSelf=self;
NSURLSession * session= [NSURLSession sharedSession];
NSURLSessionDataTask * dataTask= [session dataTaskWithURL:listURL completionHandler:^(NSData * _Nullable data, NSURLResponse * _Nullable response, NSError * _Nullable error) {
__strong typeof(weakSelf)strongSelf=weakSelf;
NSError * jsonError;
id jsonobject=[NSJSONSerialization JSONObjectWithData:data options:0 error:&jsonError];
#warning 类型的检查
NSArray *dataArray = [jsonobject objectForKey:@"data"];
NSMutableArray * listItemArray=@[].mutableCopy;
for (NSDictionary * info in dataArray) {
PositionItem * listItem= [[PositionItem alloc]init];
[listItem configWithDictionary:info];
[listItemArray addObject:listItem];
}
dispatch_async(dispatch_get_main_queue(), ^{
if(finishBlock){
finishBlock(error==nil,listItemArray.copy);
}
});
}];
[dataTask resume];
}
这边我们使用 原生的iOS网络请求 然后通通过for循环讲json数组转成我们的 nsarray 然后通过block 回调到我们的viewcontroller
.数据模型类
//
// PositionItem.h
// bosstab
//
// Created by xuqing on 2021/2/21.
//
#import
NS_ASSUME_NONNULL_BEGIN
//"id": 4,
// "name": "资深安卓工程师",
// "cname": "今日头条",
// "size": "D轮",
// "salary": "40K-60K",
// "username": "Kimi",
// "title": "HR"
@interface PositionItem : NSObject
@property(nonatomic,copy,readwrite)NSString * userid ;
@property(nonatomic,copy,readwrite)NSString * name;
@property(nonatomic,copy,readwrite)NSString * cname;
@property(nonatomic,copy,readwrite)NSString * size;
@property(nonatomic,copy,readwrite)NSString * salary ;
@property(nonatomic,copy,readwrite)NSString * username;
@property(nonatomic,copy,readwrite)NSString * title;
-(void)configWithDictionary:(NSDictionary *)dictionary;
@end
NS_ASSUME_NONNULL_END
自定义cell
//
// HomeViewCell.m
// bosstab
//
// Created by xuqing on 2021/11/2.
//
#import "HomeViewCell.h"
@interface HomeViewCell()
@property (weak, nonatomic) IBOutlet UILabel *cnameLable;
@property (weak, nonatomic) IBOutlet UILabel *salary;
@property (weak, nonatomic) IBOutlet UILabel *namesizeLable;
@property (weak, nonatomic) IBOutlet UIView *usernameLable;
@end
@implementation HomeViewCell
- (void)awakeFromNib {
[super awakeFromNib];
// Initialization code
}
- (void)setSelected:(BOOL)selected animated:(BOOL)animated {
[super setSelected:selected animated:animated];
// Configure the view for the selected state
}
- (void)layoutTableViewCellWithItem:(PositionItem * )item{
self.cnameLable.text=item.cname;
self.salary.text=item.salary;
NSString * nameSizestr = [ item.name stringByAppendingString:item.size];
self.namesizeLable.text=nameSizestr;
// NSString * userNamestr = [ item.username stringByAppendingString:item.title];
// self.usernameLable.text=userNamestr;
}
@end
viewcontroller 界面加载cell
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
HomeViewCell * cell = [tableView dequeueReusableCellWithIdentifier:@"HomeViewCell"];
if (!cell)
{
//xib 上 cell 不会自动加载 ;
//应用程序束:获得工程中所有的资源的路径
//获得指定的 xib 中所有的视图
NSArray * array = [[NSBundle mainBundle]loadNibNamed:@"HomeViewCell" owner:nil options:nil];
//从数组中找到对应的 cell ( xib 上只有 cell 一个视图)
// cell = [array lastObject];
for (id object in array)
{
//如果 object 是 ZYTableViewCell 类型,就找到了
if ( [object isKindOfClass:[HomeViewCell class]])
{
cell = object ;
break ;
}
}
}
[cell layoutTableViewCellWithItem:[self.dataArray objectAtIndex:indexPath.row]];
return cell;
}
纯代码布局实现自定义cell
//
// HomeTableViewCell.m
// bosstab
//
// Created by xuqing on 2021/2/21.
//
#import "HomeTableViewCell.h"
@interface HomeTableViewCell()
@property(nonatomic,strong,readwrite)UILabel * cnameLable;
@property(nonatomic,strong,readwrite)UILabel * salaryLable;
@property(nonatomic,strong,readwrite)UILabel * namesizeLable;
@property(nonatomic,strong,readwrite)UILabel * usernameLable;
@end
@implementation HomeTableViewCell
- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(nullable NSString *)
reuseIdentifier {
self=[super initWithStyle:style reuseIdentifier:reuseIdentifier];
if(self){
[self.contentView addSubview:({
self.cnameLable=[[UILabel alloc]initWithFrame:CGRectMake(20, 20, 100, 20)];
self.cnameLable.font=[UIFont systemFontOfSize:14];
self.cnameLable;
})];
//self.salaryLable=[[UILabel alloc]initWithFrame:CGRectMake(20, 50, 50, 20)];
[self.contentView addSubview:({
self.salaryLable=[[UILabel alloc]initWithFrame:CGRectMake(300, 20, 100, 20)];
self.salaryLable.font=[UIFont systemFontOfSize:14];
self.salaryLable.textColor=[UIColor redColor];
self.salaryLable;
})];
[self.contentView addSubview:({
self.namesizeLable=[[UILabel alloc]initWithFrame:CGRectMake(20 ,50, self.frame.size.width, 20)];
self.namesizeLable.font=[UIFont systemFontOfSize:18];
self.namesizeLable.textColor= [UIColor grayColor];
self.namesizeLable;
})];
// self.usernameLable=[[UILabel alloc]initWithFrame:CGRectMake(300 ,20, 50, 20)];
[self.contentView addSubview:({
self.usernameLable=[[UILabel alloc]initWithFrame:CGRectMake(20 ,90, 100, 20)];
self.usernameLable.font=[UIFont systemFontOfSize:14];
self.usernameLable.textColor= [UIColor greenColor];
self.usernameLable;
})];
}
return self;
}
- (void)layoutTableViewCellWithItem:(PositionItem * )item{
self.cnameLable.text=item.cname;
self.salaryLable.text=item.salary;
NSString * nameSizestr = [ item.name stringByAppendingString:item.size];
self.namesizeLable.text=nameSizestr;
NSString * userNamestr = [ item.username stringByAppendingString:item.title];
self.usernameLable.text=userNamestr;
}
@end
纯代码自定义cell 加载
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
HomeTableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:@"id"];
if(!cell){
cell =[[HomeTableViewCell alloc]initWithStyle:UITableViewCellStyleSubtitle
reuseIdentifier:@"id"];
}
[cell layoutTableViewCellWithItem:[self.dataArray objectAtIndex:indexPath.row]];
return cell;
}
剩下的 消息模块和公司模块处理起来差不多 我这边就不重复展开讲了
最后总结:
这次的iOS 开发的学习 对比起安卓的有一点点相似的地方 但是仔细去看 差异还是很大 不光是java和oc 语法的差异 还有整个操作系统设计思想的开发思路的不同 所以别的端的同学转过来学习 是非常需要耐心和时间的 前期一定要多动手。 个人感觉还是以xib布局为主 部分地方用纯代码布局 即可 对新手比较友好 在比较熟悉的情况可以尝试用纯代码布局 后期方便维护 。
项目地址:
码云 : https://gitee.com/qiuyu123/iosbosstab