zoukankan      html  css  js  c++  java
  • 使用tableview的表头button 实现多 cell 的选择

    首先声明本篇博文是作者原创,在QQ群里看到一枚猿友求助,问题描述:使用UItableView 实现在表头里点击不同的按钮,去刷新当前的界面(界面是大的 cell),自己就实现了一下。 

    实验原材料:故事版(storyBoard)、xib、UItableView、通知中心

    技术点:多cell 的切换、通知的收发、*通知用完及时移除

    先看效果图:

    默认的当前界面是左图。点击“课程介绍”按钮就刷新为左图,点击“课程讨论”按钮就刷新为中图,点击“作品介绍”按钮就刷新为右图。

            

    实现代码上传到我的群空间,如果需要,请去QQ群 215901818 下载。

    实现关键代码:

    #import "ViewController.h"
    #import "CellA.h"
    #import "CellB.h"
    #import "CellC.h"
    #import "Empty.h"
    
    @interface ViewController ()<UITableViewDelegate,UITableViewDataSource>
    
    @property (weak, nonatomic) IBOutlet UITableView *myTableView;
    @property(nonatomic,assign)BOOL isSelectA,isSelectB,isSelectC;
    
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        self.myTableView.backgroundColor = [UIColor redColor];
        
        //注册
        [self RegisterCellID];
    
        //通知中心去接受通知
        [self getNotify];
    
        //默认的设置,加载哪一个cell
        [self setBoolCell];
    
    }
    
    //设置,加载哪一个 cell 的 bool 值
    -(void)setBoolCell{
        self.isSelectA = YES;
        self.isSelectB = NO;
        self.isSelectC = NO;
    }
    
    //接通知方法
    -(void)getNotify{
    
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(changeReloading:) name:nil object:nil];
    }
    
    //接受到通知之后要办理的事情
    -(void)changeReloading:(NSNotification *)notify{
        
        if ([notify.userInfo[@"key"] isEqualToString:@"post1"]) {
            NSLog(@"收到通知 %@",notify.userInfo[@"key"]);
            self.isSelectA = YES;
            self.isSelectB = NO;
            self.isSelectC = NO;
            [self.myTableView reloadData];
        }
        if ([notify.userInfo[@"key"] isEqualToString:@"post2"]) {
            NSLog(@"收到通知 %@",notify.userInfo[@"key"]);
            self.isSelectA = NO;
            self.isSelectB = YES;
            self.isSelectC = NO;
            [self.myTableView reloadData];
        }
        if ([notify.userInfo[@"key"] isEqualToString:@"post3"]) {
            NSLog(@"收到通知 %@",notify.userInfo[@"key"]);
            self.isSelectA = NO;
            self.isSelectB = NO;
            self.isSelectC = YES;
            [self.myTableView reloadData];
        }
        
    }
    
    //注册cellId 方法
    -(void)RegisterCellID{
        [self.myTableView registerClass:[CellA class] forCellReuseIdentifier:@"cellA"];
        [self.myTableView registerClass:[CellB class] forCellReuseIdentifier:@"cellB"];
        [self.myTableView registerClass:[CellC class] forCellReuseIdentifier:@"cellC"];
    }
    
    //得到cellID 的方法
    -(NSArray *)getCellID{
            NSArray * tempArr = [NSArray arrayWithObjects:@"cellA",@"cellB",@"cellC", nil];
            return tempArr;
    }
    #pragma Mark===自定义表的头部
    
    -(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section{
        Empty * viewHead = [[[NSBundle mainBundle]loadNibNamed:@"Empty" owner:self options:nil] lastObject];
        viewHead.backgroundColor = [UIColor blackColor];
        viewHead.frame = CGRectMake(0, 0, self.myTableView.bounds.size.width, 100);
        return viewHead;
        
    }
    -(CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section{
        return 100;
    }
    
    #pragma Mark===必须实现的两个代理方法
    
    - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
        return 10;
    }
    -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
        
        if (self.isSelectA == YES) {
            CellA * cellA = [tableView dequeueReusableCellWithIdentifier:[self getCellID][0]];
            if (cellA == nil) {
                cellA = [[CellA alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:[self getCellID][0]];
            }
            cellA.textLabel.text = @"000000";
            return cellA;
            
        }else if (self.isSelectB == YES){
            
            CellB * cellB = [tableView dequeueReusableCellWithIdentifier:[self getCellID][1]];
            if (cellB == nil) {
                cellB = [[CellB alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:[self getCellID][1]];
            }
            cellB.textLabel.text = @"1111111";
            return cellB;
            
        }else if (self.isSelectC == YES){
            
            CellC * cellC = [tableView dequeueReusableCellWithIdentifier:[self getCellID][2]];
            if (cellC == nil) {
                cellC = [[CellC alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:[self getCellID][2]];
            }
            cellC.textLabel.text = @"2222222";
            
            return cellC;
            
        }
        return nil;
    }
    
    
    -(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
        return 1;
    }
    
    //在合适的时候移除通知中心,由于 根视图不能移除,所以 dealloc 方法这里不管用,这里写在了页面消失的时候
    -(void)viewWillDisappear:(BOOL)animated{
        [super viewWillAppear:animated];
        [[NSNotificationCenter defaultCenter] removeObserver:self forKeyPath:@"post1"];
        [[NSNotificationCenter defaultCenter] removeObserver:self forKeyPath:@"post2"];
        [[NSNotificationCenter defaultCenter] removeObserver:self forKeyPath:@"post3"];
        
    }
    
    
    @end
    View Code ViewController.m
    #import "Empty.h"
    
    @implementation Empty
    
    -(instancetype)initWithFrame:(CGRect)frame{
        self = [super initWithFrame:frame];
        if (self) {
            NSLog(@"加载了噢噢噢噢");
        }
        return self;
    }
    
    - (IBAction)buttonA:(UIButton *)sender {
        NSLog(@"点击了--课程介绍");
        NSString * post1 = @"post1";
        [self postNotifyWith:post1];
    }
    
    - (IBAction)buttonB:(UIButton *)sender {
        NSLog(@"点击了--课程讨论");
        NSString * post1 = @"post2";
        [self postNotifyWith:post1];
    }
    
    - (IBAction)buttonC:(UIButton *)sender {
        NSLog(@"点击了--作品展示");
        NSString * post1 = @"post3";
        [self postNotifyWith:post1];
    }
    
    //发通知实现
    -(void)postNotifyWith:(NSString *)sender{
        [[NSNotificationCenter defaultCenter] postNotificationName:sender object:self userInfo:@{@"key":sender}];
        
    }
    
    @end
    View Code Empty.m

    对应的故事版如下左图、对应的xib如下右图所示:

      

    可使用领域的猜想:作为页面的加载少量数据的组件出现

    有可能出现的问题:效率底下、在通知中心的使用上有可能出现问题

    other(再小的组件功能实现了就是一件开心的事情)

  • 相关阅读:
    routine的加载
    Forms Authentication and Role based Authorization: A Quicker, Simpler, and Correct Approach
    How does Request.IsAuthenticated work?
    细说ASP.NET Forms身份认证
    IIS URL Rewriting and ASP.NET Routing
    Razor syntax reference for ASP.NET Core
    win10 合并磁盘 disk Acronis Disk Director
    bad object refs/remotes/origin/HEAD
    https://www.atlassian.com/git/tutorials/git-gc
    c++ 中文字符串处理方法
  • 原文地址:https://www.cnblogs.com/benpaobadaniu/p/5115135.html
Copyright © 2011-2022 走看看