IOS UI 第十篇: UITABLEVIEW

uitableView review yesterday’s knowledge :


51b98580e49e1148c1b89427c0fbe0e8 2
 
 
 
 
folding group :
 
--------------------------------------------------------------------------------------------------------------------------------------------------
teacher code : 
 
-( UIView *)tableView:( UITableView  *)tableView viewForHeaderInSection:( NSInteger )section{
    
QFGroupHead  *headView=[[ NSBundle   mainBundle ] loadNibNamed : @"QFGroupHead"   owner : nil   options : nil ][ 0 ];
    [headView 
addTarget : self   action : @selector (onHeadClicked:)  forControlEvents : UIControlEventTouchUpInside ];
    headView.
tag =section;
    
QFQQGroupModel  *model= dataArray [section];
    [headView 
refreshUIWithModel :model];
    
return  headView;
}
 
-( void )onHeadClicked:( UIView  *)headView{
    
NSLog ( @"onHeadClicked:%d" ,headView. tag );
    
QFQQGroupModel  *model= dataArray [headView. tag ];
    model.
isHide =!model. isHide ;
    [
self . myTableView   reloadSections :[ NSIndexSet   indexSetWithIndex :headView. tag withRowAnimation : UITableViewRowAnimationNone ];
}

 
 
-( NSInteger )tableView:( UITableView  *)tableView numberOfRowsInSection:( NSInteger )section{
    
// 在数据源中取出数据模型
    
QFQQGroupModel  *model= dataArray [section];
    
if  (model. isHide ) {
        
return   0 ;
    }
    
// 返回数据模型中相应的数据
    
return  model. groupMember . count ;
}

 
teacher ’s dataModel :
 
@property  ( nonatomic , copy NSString  *groupName;
@property   int  friendNum;
@property  ( nonatomic , strong NSMutableArray  *groupMember;
@property   BOOL  isHide;
 
 
 
--------------------------------------------------------------------------------------------------------------------------------------------------
My code :
 
 
- ( UIView  *)tableView:( UITableView  *)tableView viewForHeaderInSection:( NSInteger )section{
    
GroupHead  *groupHead = [[ NSBundle   mainBundle loadNibNamed : @"GroupHead"   owner : nil   options : nil ][ 0 ];
    
    [groupHead 
addTarget : self   action : @selector (onHeadClicked:)  forControlEvents : UIControlEventTouchUpInside ];
    groupHead.
tag  = section;
    [groupHead 
refreshUIWithModel : self . model   modelSection :section];
    
return  groupHead;
}
 
-( void )onHeadClicked:( UIView  *)headView{
    
    
NSNumber  *number =  self . model . isHiddenArray [headView. tag ];
    
if (number. intValue  ==  1 )
        [
self . model   isHiddenSection :headView. tag   Boolis : NO ];
    
else
        [
self . model   isHiddenSection :headView. tag   Boolis : YES ];
    
    [
self . myTableView   reloadSections :[ NSIndexSet   indexSetWithIndex :headView. tag withRowAnimation : UITableViewRowAnimationNone ];
    
}

 

- (
NSInteger )tableView:( UITableView  *)tableView numberOfRowsInSection:( NSInteger )section
{
    
NSNumber  *number =  self . model . isHiddenArray [section];
    
if (number. intValue ){
        
return   0 ;
    }
    
return  [ self . model . groupMemberNum [section]  intValue ];
}

 
my DataModel :
 
@property  ( nonatomic strong NSMutableArray  *groupName;
@property  ( nonatomic strong NSMutableArray  *dataArray;
@property  ( nonatomic strong NSMutableArray  *groupMemberNum;
@property  ( nonatomic strong NSMutableArray  *isHiddenArray;
@property   int  groupNum;
-(
void )begin;
-(
void )isHiddenSection:( NSInteger )section Boolis:( BOOL )isbool;
@end
 
 
DataModel implement :
 
-( void )begin{
    
_dataArray  = [ NSMutableArray   array ];
    
_groupName  = [ NSMutableArray   array ];
    
_groupMemberNum  = [ NSMutableArray   array ];
    
_isHiddenArray  = [ NSMutableArray   array ];
    
_groupNum  =  10 ;
    
for  ( int  i= 0 ; i< 10 ; ++i) {
        
NSMutableArray  *groupArray = [ NSMutableArray   array ];
        
NSString  *groupstr = [ NSString   stringWithFormat : @"Group %d" , i];
        [
_groupName   addObject :groupstr];
        
int  num =  arc4random ()% 10 + 1 ;
        
NSNumber  *nsNum = [[ NSNumber   alloc initWithBool : NO ];
        [
_isHiddenArray   addObject :nsNum];
        [
_groupMemberNum   addObject :[ NSString   stringWithFormat : @"%d" , num]];
        
for  ( int  j= 0 ; j<num; ++j) {
            
NSString  *str = [ NSString   stringWithFormat : @"cell %d" , j];
            [groupArray 
addObject :str];
        }
        [
_dataArray   addObject :groupArray];
    }
}

-(
void )isHiddenSection:( NSInteger )section Boolis:( BOOL )isbool{
    
NSNumber  *num = [[ NSNumber   alloc initWithBool :isbool];
    [
_isHiddenArray   removeObjectAtIndex :section];
    [
_isHiddenArray   insertObject :num  atIndex :section];
}
 
 
GroupHead :
 
-( void )refreshUIWithModel:( Datamodel *)model modelSection:( NSInteger )section{
    
groupName . text  = model. groupName [section];
    
totalMember . text  = [ NSString   stringWithFormat : @"TotalMember:%@" , model. groupMemberNum [section]];
    
NSNumber  *number = model. isHiddenArray [section];
    
if (number. intValue  ==  0 )
        
hiddenStatus . text  =  @">" ;
    
else   hiddenStatus . text  =  @"v" ;
}
 
--------------------------------------------------------------------------------------------------------------------------------------------------
 
Search Bar :
 
      完成搜索功能的步骤
     
     1
、先实例化一个全局数组,用于储存搜索结果。
     2
、实例化一个 UISearchBar ,并设置为 tableview tableheadview
     3
、用上面实例化的 seachbar 初始化一个搜索结果显示视图( UISearchDisplayController
     4
、设置 uiseachDisplayController 的三个代理
     //searchDC
内部有一个 talbview ,这里设置代理就等于给它内部的 tableview 设置代理
     searchDC.searchResultsDataSource=self;
     searchDC.searchResultsDelegate=self;
     //searchDC
自己的代理
     searchDC.delegate=self;
     5
、导入 UISearchDisplayDelegate 协议
     6
、实现 UISearchDisplayDelegate 的一个重要的代理方法
     - (BOOL)searchDisplayController:(UISearchDisplayController *)controller shouldReloadTableForSearchString:(NSString *)searchString
     
每当搜索栏的文字发生变化时,都会调用这个代理方法
     
在这个方法里面我们遍历整个数据源,找到包含搜索文字的那些,然后放进搜索结果的数组里面(注意,搜索之前要记得把搜索结果的数组先清空)
     7
、由于 myTableView 和搜索结果的 tableview 共用我们这个类的那些代理方法,所以要在所有的代理方法里面加入判断,以返回正确的数据。
     
例如:
     //
有多少组
     -(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
     //
判断是否为 searchDisplayController 的结果 tableview
     if (tableView==searchDC.searchResultsTableView) {
     return 1;
     }
     return totalArray.count;
     }
     
、、、、、
     
     8
、至此,搜索功能完成。
     
     */
 
 
 
 
--------------------------------------------------------------------------------------------------------------------------------------------------
 
my Search Bar Code ::
 
//
//  MainViewController.m
//  UITableViewCellXib_01
//
//  Created by YuLei on 4/11/14.
//  Copyright (c) 2014 ___DuanYuLei___. All rights reserved.
//

#import  "MainViewController.h"
#import 
"GroupHead.h"

@interface   MainViewController  () < UITableViewDataSource UITableViewDelegate UISearchDisplayDelegate ]]>
@property  ( weak nonatomic IBOutlet   UITableView  *myTableView;
@end

@implementation  MainViewController{
    
UISearchDisplayController  *searchDisplayController;
}


- (
id )initWithNibName:( NSString  *)nibNameOrNil bundle:( NSBundle  *)nibBundleOrNil
{
    
self  = [ super   initWithNibName :nibNameOrNil  bundle :nibBundleOrNil];
    
if  ( self ) {
        
    }
    
return   self ;
}

- (
void )viewDidLoad
{
    [
super   viewDidLoad ];
    
// Do any additional setup after loading the view from its nib.
    
    
_model  = [[ Datamodel   alloc init ];
    [
_model   begin ];
    
self . myTableView . delegate  =  self ;
    
self . myTableView . dataSource  =  self ;
    
    
//search function
    
UISearchBar  *searchBar = [[ UISearchBar   alloc initWithFrame : CGRectMake ( 0 0 320 30 )];
    
self . myTableView . tableHeaderView  = searchBar;
    
    
searchDisplayController  = [[ UISearchDisplayController   alloc initWithSearchBar :searchBar  contentsController : self ];
    
searchDisplayController . searchResultsDataSource  =  self ;
    
searchDisplayController . searchResultsDelegate  =  self ;
    
searchDisplayController . delegate  =  self ;

    
    
    
//create a colorful foot line or clear the line.
    
UIView  *footView = [[ UIView   alloc initWithFrame : CGRectMake ( 0 0 320 1 )];
    footView.
backgroundColor  = [ UIColor   clearColor ];
    
self . myTableView . tableFooterView  = footView;
}

- (
void )didReceiveMemoryWarning
{
    [
super   didReceiveMemoryWarning ];
    
// Dispose of any resources that can be recreated.
}

-(
CGFloat )tableView:( UITableView  *)tableView heightForHeaderInSection:( NSInteger )section{
    
if (tableView ==  searchDisplayController . searchResultsTableView )
        
return   0 ;
    
return   44 ;
}

-(
void )onHeadClicked:( UIView  *)headView{
    
    
NSNumber  *number =  self . model . isHiddenArray [headView. tag ];
    
    
if (number. intValue  ==  1 )
        [
self . model   isHiddenSection :headView. tag   Boolis : NO ];
    
else
        [
self . model   isHiddenSection :headView. tag   Boolis : YES ];
    
    [
self . myTableView   reloadSections :[ NSIndexSet   indexSetWithIndex :headView. tag withRowAnimation : UITableViewRowAnimationNone ];
    
}


- (
UIView  *)tableView:( UITableView  *)tableView viewForHeaderInSection:( NSInteger )section{
    
GroupHead  *groupHead = [[ NSBundle   mainBundle loadNibNamed : @"GroupHead"   owner : nil   options : nil ][ 0 ];
    
if  (tableView ==  searchDisplayController . searchResultsTableView ) {
        
return   nil ;
    }
    
    [groupHead 
addTarget : self   action : @selector (onHeadClicked:)  forControlEvents : UIControlEventTouchUpInside ];
    groupHead.
tag  = section;
    [groupHead 
refreshUIWithModel : self . model   modelSection :section];
    
return  groupHead;
}

- (
NSInteger )tableView:( UITableView  *)tableView numberOfRowsInSection:( NSInteger )section
{
    
    
if  (tableView ==  searchDisplayController . searchResultsTableView ) {
        
return   self . model . searchDataArray . count ;
    }
    
    
NSNumber  *number =  self . model . isHiddenArray [section];
    
if (number. intValue ){
        
return   0 ;
    }
    
return  [ self . model . groupMemberNum [section]  intValue ];
}

- (
NSInteger )numberOfSectionsInTableView:( UITableView  *)tableView{
    
if (tableView ==  searchDisplayController . searchResultsTableView )
        
return   1 ;
    
return   self . model . groupNum ;
}

- (
UITableViewCell  *)tableView:( UITableView  *)tableView cellForRowAtIndexPath:( NSIndexPath  *)indexPath{
    
static   NSString  *reuseID =  @"myCell" ;
    
UITableViewCell  *cell = [ _myTableView   dequeueReusableCellWithIdentifier :reuseID];
    
if  (cell ==  nil ) {
        cell = [[
UITableViewCell   alloc initWithStyle : UITableViewCellStyleDefault   reuseIdentifier : nil ];
    }
    
    
if (tableView ==  searchDisplayController . searchResultsTableView ){
        cell.
textLabel . text  =  self . model . searchDataArray [indexPath. row ];
    }
else {
        cell.
textLabel . text  =  self . model . dataArray [indexPath. section ][indexPath. row ];
    }
    
return  cell;
}

- (
BOOL )searchDisplayController:( UISearchDisplayController  *)controller shouldReloadTableForSearchString:( NSString  *)searchString{
    [
self . model . searchDataArray   removeAllObjects ];
    
for  ( int  i= 0 ; i< self . model . groupNum ; ++i) {
        
NSArray  *friends =  self . model . dataArray [i];
        
for  ( int  j= 0 ; j<friends. count ; ++j) {
            
NSString  *str = friends[j];
            
NSRange  range = [str  rangeOfString :searchString];
            
if  (range. length  >  0 ) {
                [
self . model . searchDataArray   addObject :str];
            }
        }
    }
    
return   YES ;
}


@end
 
--------------------------------------------------------------------------------------------------------------------------------------------------
 
Add a groupHeader cache
 
 
define it in :
 
@implementation  MainViewController{
    
UISearchDisplayController  *searchDisplayController;
    
NSMutableDictionary  *cacheHeadViewDictionary;
}
 
- ( void )viewDidLoad{
    [
super   viewDidLoad ];
    
cacheHeadViewDictionary =[ NSMutableDictionary   dictionary ];
 
 
use it as function   <tableView:viewForHeaderInSection>
 
- ( UIView  *)tableView:( UITableView  *)tableView viewForHeaderInSection:( NSInteger )section{
    
if  (tableView ==  searchDisplayController . searchResultsTableView ) {
        
return   nil ;
    }
    
    
GroupHead  *groupHead =  cacheHeadViewDictionary [[ NSString   stringWithFormat : @"%d" , section]];
    
if  (groupHead ==  nil ) {
        groupHead = [[
NSBundle   mainBundle loadNibNamed : @"GroupHead"   owner : nil   options : nil ][ 0 ];
        groupHead.
backgroundColor =[ UIColor   colorWithRed :( CGFloat ) random ()/ RAND_MAX   green :( CGFloat ) random ()/ RAND_MAX   blue :( CGFloat ) random ()/ RAND_MAX   alpha : 1 ];
        [groupHead 
addTarget : self   action : @selector (onHeadClicked:)  forControlEvents : UIControlEventTouchUpInside ];
        groupHead.
tag  = section;
        [
cacheHeadViewDictionary   setObject :groupHead  forKey :[ NSString   stringWithFormat : @"%d" ,section]];
    }
    [groupHead 
refreshUIWithModel : self . model   modelSection :section];
    
return  groupHead;
}
 
 
--------------------------------------------------------------------------------------------------------------------------------------------------
 
 
 
 
 
 
 
 
 
 
 
 
 
 

你可能感兴趣的:(UITableView)