ios 仿boss直聘学习demo

举报
xq9527 发表于 2022/06/09 15:16:51 2022/06/09
【摘要】 前言:最近在学习iOS 主要学习的还是 oc语言和xib的使用 那么废话不多说。正式开始 效果图: 具体实现 : 1 底部导航实现: UITabBarController *tabVC = [[UITabBarController alloc]init]; HomeController * homecontroller =[[HomeController alloc] init]...

前言:

最近在学习iOS 主要学习的还是 oc语言和xib的使用 那么废话不多说。正式开始

效果图:

6865547-4837454c85f6e221.png
6865547-fb15213b3845b6fb.png
6865547-19f3c096d273c9dd.png

具体实现 :

  • 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/home_selected@2x.png"]; //默认图片
    homecontroller.tabBarItem.selectedImage = [UIImage systemImageNamed:@"icon.bundle/home@2x.png"]; //选中图片
    
    companyController.title = @"公司"; //导航栏文字
    companyController.tabBarItem.title = @"公司"; //tab文字
    companyController.tabBarItem.image = [UIImage systemImageNamed:@"icon.bundle/home_selected@2x.png"]; //默认图片
    companyController.tabBarItem.selectedImage = [UIImage systemImageNamed:@"icon.bundle/home@2x.png"]; //选中图片
  
    messageController.title = @"消息"; //导航栏文字
    messageController.tabBarItem.title = @"消息"; //tab文字
    messageController.tabBarItem.image = [UIImage systemImageNamed:@"icon.bundle/home_selected@2x.png"]; //默认图片
    messageController.tabBarItem.selectedImage = [UIImage systemImageNamed:@"icon.bundle/home@2x.png"]; //选中图片
   
    myController.title = @"我的"; //导航栏文字
    myController.tabBarItem.title = @"我的"; //tab文字
    myController.tabBarItem.image = [UIImage systemImageNamed:@"icon.bundle/home_selected@2x.png"]; //默认图片
    myController.tabBarItem.selectedImage = [UIImage systemImageNamed:@"icon.bundle/home@2x.png"]; //选中图片
    [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 ()<UITableViewDelegate,UITableViewDataSource>
@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<PositionItem *> * _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<PositionItem *> * _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 <Foundation/Foundation.h>
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

6865547-fba65fcc2a794946.png

//
//  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

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。