IOS UI 第九篇: UITABLEVIEW

學英語。 因此用英文來記錄筆記。
 
Define the dataSource:
 
@implementation  ViewController
{
    
NSMutableArray  *dataSourse;
    UITableView  *myTableView;
}
 
Define the dataSource array:
 
    dataSourse  = [ NSMutableArray   array ];
    
for  ( int  i= 0 ; i< 50 ; ++i) {
        
NSString  *str = [ NSString   stringWithFormat : @"the %d row" , i];
        [
dataSourse   addObject :str];
    }
 
 
DataSource Two-dimensional Array:
 
     dataSource  = [ NSMutableArray   array ];
    
for  ( int  s= 0 ; s< 5 ; ++s) {
        
NSMutableArray  *sectionArray=[ NSMutableArray   array ];
        
for  ( int  r= 0 ; r< 10 ; ++r) {
            
NSString  *str=[ NSString   stringWithFormat : @"the %d group--the %d row" , s, r];
            [sectionArray 
addObject :str];
        }
        [
dataSource   addObject :sectionArray];
    }
 
 
 
Create a UITABLEVIEW
 
     UITableView  *myTableVie = [[ UITableView   alloc initWithFrame : CGRectMake ( 0 20 320 480 style : UITableViewStylePlain ];
    
    myTableVie.
delegate  =  self ;
    myTableVie.
dataSource  =  self ;
    
    [
self . view   addSubview :myTableVie];
 
 
Implement delegate:
 
#import  "ViewController.h"

@interface   ViewController  ()< UITableViewDataSource  ,  UITableViewDelegate ]]>

@end
 
 
The UITableViewDataSource  have two function which must be implemented:
 
- ( UITableViewCell  *)tableView:( UITableView  *)tableView cellForRowAtIndexPath:( NSIndexPath  *)indexPath
{
    
UITableViewCell  *cell = [[ UITableViewCell   alloc initWithStyle : UITableViewCellStyleDefault   reuseIdentifier : @"xxxx" ];
    
    
NSString  *str =  dataSourse [indexPath. row ];
    cell.
textLabel . text =[ NSString   stringWithFormat : @"I am a cell %@" , str];
    
return  cell;
}
 
- ( NSInteger )tableView:( UITableView  *)tableView numberOfRowsInSection:( NSInteger )section
{
    
return   dataSourse . count ;
}
 
 
The Reusable Mechanism:
 
 
- ( UITableViewCell  *)tableView:( UITableView  *)tableView cellForRowAtIndexPath:( NSIndexPath  *)indexPath
{

    
static   NSString  *reuseID =  @"myCell" ;
    
UITableViewCell  *cell=[tableView  dequeueReusableCellWithIdentifier :reuseID];
    
if  (cell ==  nil ) {
        
NSLog ( @"alloc new cell" );
        cell = [[
UITableViewCell   alloc initWithStyle : UITableViewCellStyleValue1   reuseIdentifier :reuseID];
        cell.
detailTextLabel . text  = [ NSString   stringWithFormat : @"previous %d" , indexPath. row ];
    }
    
NSString  *str= dataSourse [indexPath. row ];
    cell.
textLabel . text =[ NSString   stringWithFormat : @"I am a cell %@" , str];
    
return  cell;
}
 
 
Add the group (all code):
 
- ( void )viewDidLoad
{
    
    [
super   viewDidLoad ];
    
    
dataSource  = [ NSMutableArray   array ];
    
for  ( int  s= 0 ; s< 5 ; ++s) {
        
NSMutableArray  *sectionArray=[ NSMutableArray   array ];
        
for  ( int  r= 0 ; r< 10 ; ++r) {
            
NSString  *str=[ NSString   stringWithFormat : @"the %d group--the %d row" , s, r];
            [sectionArray 
addObject :str];
        }
        [
dataSource   addObject :sectionArray];
    }
    
    
UITableView  *myTableVie = [[ UITableView   alloc initWithFrame : CGRectMake ( 0 20 320 self . view . frame . size . height style : UITableViewStylePlain ];
    
    myTableVie.
delegate  =  self ;
    myTableVie.
dataSource  =  self ;
    
    
    
UIView  *headView=[[ UIView   alloc ] initWithFrame : CGRectMake ( 0 0 320 200 )];
    headView.
backgroundColor =[ UIColor   redColor ];
    myTableVie.
tableHeaderView =headView;
    [
self . view   addSubview :myTableVie];
    
}

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

-(
CGFloat )tableView:( UITableView  *)tableView heightForHeaderInSection:( NSInteger )section{
    
return   30 ;
}

-(
NSString  *)tableView:( UITableView  *)tableView titleForHeaderInSection:( NSInteger )section{
    
return  [ NSString   stringWithFormat : @"The %d group" , section];
}

//DIY group header , but if overwrite the function, the groupheader function is unvaliable..

 -(
UIView  *)tableView:( UITableView  *)tableView viewForHeaderInSection:( NSInteger )section{
 
UIView  *headView=[[ UIView   alloc initWithFrame : CGRectMake ( 0 0 320 30 )];
 headView.
backgroundColor  = [ UIColor   blackColor ];
 
 
UILabel  *label=[[ UILabel   alloc initWithFrame :headView. frame ];
 label.
text =[ NSString   stringWithFormat : @"The %d group" , section];
 label.
textColor =[ UIColor   redColor ];
 label.
textAlignment  =  NSTextAlignmentCenter ;
 label.
font =[ UIFont   boldSystemFontOfSize : 15 ];
 [headView 
addSubview :label];
 
return  headView;
 }

- (
NSInteger )numberOfSectionsInTableView:( UITableView  *)tableView{
    
return   dataSource . count ;
}




-(
NSInteger )tableView:( UITableView  *)tableView numberOfRowsInSection:( NSInteger )section{
    
NSArray  *sectionArray= dataSource [section];
    
return  sectionArray. count ;
}



- (
UITableViewCell  *)tableView:( UITableView  *)tableView cellForRowAtIndexPath:( NSIndexPath  *)indexPath
{

    
static   NSString  *reuseID =  @"myCell" ;
    
UITableViewCell  *cell=[tableView  dequeueReusableCellWithIdentifier :reuseID];
    
if  (cell ==  nil ) {
        
NSLog ( @"alloc new cell" );
        cell = [[
UITableViewCell   alloc initWithStyle : UITableViewCellStyleValue1   reuseIdentifier :reuseID];
        cell.
detailTextLabel . text  = [ NSString   stringWithFormat : @"previous %d" , indexPath. row ];
    }
    
NSString  *str= dataSource [indexPath. section ][indexPath. row ];
    cell.
textLabel . text =str;
    
return  cell;
}
 
 
Delete the tableView in one row :
 
-( void )tableView:( UITableView  *)tableView commitEditingStyle:( UITableViewCellEditingStyle )editingStyle forRowAtIndexPath:( NSIndexPath  *)indexPath{
    
NSLog ( @"tableview " );
    
//delete the data in a row
    
NSMutableArray  *sectionArray =  dataSource [indexPath. section ];
    [sectionArray 
removeObjectAtIndex :indexPath. row ];
    
//delete a row in tableview
    [tableView 
deleteRowsAtIndexPaths : @[ indexPath ]   withRowAnimation : UITableViewRowAnimationFade ];
}
 
 
Ps : The difference between the  self and  sender , 
for example : 
 
-( void )onLeftButtonClicked:( id )sender{
    
NSLog ( @"d1 :%@" , sender);
    
NSLog ( @"d2 :%@" self );

    
if  ( myTableView . isEditing ) {
        
myTableView . editing = NO ;
    }
else {
        
myTableView . editing = YES ;
    }
}
 
In the Button action , 
self is the object:  <QFViewController: 0x8fab460> sender is the object:  <UIBarButtonItem: 0x8fba3b0> 
sender is GUI widget self. 
self is the class self.
 
 
The IOS 7 own particular feature :
 
self . automaticallyAdjustsScrollViewInsets = NO ;
 
It make the layout automatic adapt the padding.
 
 
//How many group
-(
NSInteger )numberOfSectionsInTableView:( UITableView  *)tableView{
    
return   dataSource . count ;
}
//Set group header height
-(
CGFloat )tableView:( UITableView  *)tableView heightForHeaderInSection:( NSInteger )section{
    
return   30 ;
}
//Set group header text
-(
NSString *)tableView:( UITableView  *)tableView titleForHeaderInSection:( NSInteger )section{
    
return  [ NSString   stringWithFormat : @"The %d group" ,section];
}
 
//User-defined group-header, if overwrite this function, the function which set header text is invalid.
-(
UIView *)tableView:( UITableView  *)tableView viewForHeaderInSection:( NSInteger )section{
    
UIView  *headView=[[ UIView   alloc ] initWithFrame : CGRectMake ( 0 0 320 30 )];
    //headView’s width must be the same with the return variable of function which named tableView:heightForHeaderInSection:
 
    headView. backgroundColor =[ UIColor   colorWithRed :( CGFloat ) random ()/ RAND_MAX   green :( CGFloat ) random ()/ RAND_MAX   blue :( CGFloat ) random ()/ RAND_MAX   alpha : 1 ];
    
UILabel  *label=[[ UILabel   alloc ] initWithFrame :headView. frame ];
    label.
text =[ NSString   stringWithFormat : @"The %d group " ,section];
    label.
font =[ UIFont   boldSystemFontOfSize : 15 ];
    label.
textColor =[ UIColor   redColor ];
    label.
textAlignment = NSTextAlignmentCenter ;
    [headView 
addSubview :label];
    
    
return  headView;
}
 
//How many rows every group own
- (
NSInteger )tableView:( UITableView  *)tableView numberOfRowsInSection:( NSInteger )section{
    
NSArray  *sectionArray= dataSource [section];
    
return  sectionArray. count ;
}
 
 
//return this row cell
- (
UITableViewCell  *)tableView:( UITableView  *)tableView cellForRowAtIndexPath:( NSIndexPath  *)indexPath{

    
static   NSString  *reuseID= @"myCell" ;
    
UITableViewCell  *cell=[tableView  dequeueReusableCellWithIdentifier :reuseID];
    
if  (cell== nil ) {
        
NSLog ( @"new cell" );
        cell=[[
UITableViewCell   alloc ] initWithStyle : UITableViewCellStyleValue1   reuseIdentifier :reuseID];
        cell.
detailTextLabel . text =[ NSString   stringWithFormat : @"privious %d" ,indexPath. row ];
    }
    
NSString  *str= dataSource [indexPath. section ][indexPath. row ];
    cell.
textLabel . text =str;
    
return  cell;
}

 
//Edit tableview
-(
void )tableView:( UITableView  *)tableView commitEditingStyle:( UITableViewCellEditingStyle )editingStyle forRowAtIndexPath:( NSIndexPath  *)indexPath{
    
/*
     UITableViewCellEditingStyleNone,
     UITableViewCellEditingStyleDelete,
     UITableViewCellEditingStyleInsert
     */

    
if  (editingStyle== UITableViewCellEditingStyleInsert ) {
        
//1 insert a data
        
NSString  *str=[ NSString   stringWithFormat : @ new the line  %d" ,indexPath.row];
        
NSMutableArray  *sectionArray= dataSource [indexPath. section ];
        [sectionArray 
insertObject :str  atIndex :indexPath. row ];
        
//2 insert a row in tableview
        [tableView 
insertRowsAtIndexPaths : @[ indexPath ]   withRowAnimation : UITableViewRowAnimationRight ];
    }
else   if  (editingStyle== UITableViewCellEditingStyleDelete ){
        
//1 remove a row in datasource.
        
NSMutableArray  *sectionArray= dataSource [indexPath. section ];
        [sectionArray 
removeObjectAtIndex :indexPath. row ];
        
//2 remove a row in tableview.
        [tableView 
deleteRowsAtIndexPaths : @[ indexPath ]   withRowAnimation : UITableViewRowAnimationFade ];
    }
}

//ontrol the edit state in Row
-(
UITableViewCellEditingStyle )tableView:( UITableView  *)tableView editingStyleForRowAtIndexPath:( NSIndexPath  *)indexPath{
    
if  (indexPath. section % 2 == 0 ) {
        
return   UITableViewCellEditingStyleDelete ;
    }
    
return   UITableViewCellEditingStyleInsert ;
}

//Move the row-data in tableview
-(
void )tableView:( UITableView  *)tableView moveRowAtIndexPath:( NSIndexPath  *)sourceIndexPath toIndexPath:( NSIndexPath  *)destinationIndexPath{
    
NSMutableArray  *sourceSectionArray= dataSource [sourceIndexPath. section ];
    
id  sourceData=sourceSectionArray[sourceIndexPath. row ];
    [sourceSectionArray 
removeObject :sourceData];
    
//remove it in previous location
    
NSMutableArray  *destinationSectionArray= dataSource [destinationIndexPath. section ];
    [destinationSectionArray 
insertObject :sourceData  atIndex :destinationIndexPath. row ];
    
//Insert the row in new location
    [tableView 
reloadRowsAtIndexPaths : @[ destinationIndexPath ]   withRowAnimation : UITableViewRowAnimationNone ];
    
//refresh a row, but have some error in the application.
    [tableView 
reloadData ];
}

 
The exercise picture :
 
3def14b8d3d01efe20addc1299dba3bb
相關文章
相關標籤/搜索