IOS控件-tableview

夏雅志
2023-12-01

xib中view与file·s· owner关联

xib中tableview的datasource和tableview关联

xib中tableview的delegate和tableview关联

上代码

.h文件

#import <UIKit/UIKit.h>

@interface EXTVV2ViewController : UIViewController<UITableViewDelegate,UITableViewDataSource>

@end


.m文件

//
//  EXTVV2ViewController.m
//  ExerciseTableViewV2
//
//  Created by hxl on 13-5-20.
//  Copyright (c) 2013年 xiaolei.hu. All rights reserved.
//

/*
 UITableView
 Tasks
 
 //初始化UITableView对象
 Initializing a UITableView Object
 
 – initWithFrame:style:
 - (id)initWithFrame:(CGRect)frame style:(UITableViewStyle)style
 
 
 //配置UITableView
 Configuring a Table View
 
 //tableView的style
 //UITableViewStylePlain或者UITableViewStyleGrouped,2者选1
 style  property
 @property(nonatomic, readonly) UITableViewStyle style
 
 //当前section有多少行(此方法必须实现)
 – numberOfRowsInSection:
 - (NSInteger)numberOfRowsInSection:(NSInteger)section
 //当前section的标示
 
 
 //当前tableView里有多少section,默认为1
 – numberOfSections
 - (NSInteger)numberOfSections
 
 
 //行高
 rowHeight  property
 
 
 separatorStyle  property
 separatorColor  property
 //tableview的背景
 backgroundView  property
 
 
 
 //创建cell
 Creating Table View Cells
 – registerNib:forCellReuseIdentifier:
 – registerClass:forCellReuseIdentifier:
 – dequeueReusableCellWithIdentifier:forIndexPath:
 – dequeueReusableCellWithIdentifier:
 
 
 
 
 Accessing Header and Footer Views
 – registerNib:forHeaderFooterViewReuseIdentifier:
 – registerClass:forHeaderFooterViewReuseIdentifier:
 – dequeueReusableHeaderFooterViewWithIdentifier:
 tableHeaderView  property
 tableFooterView  property
 sectionHeaderHeight  property
 sectionFooterHeight  property
 – headerViewForSection:
 – footerViewForSection:
 Accessing Cells and Sections
 – cellForRowAtIndexPath:
 – indexPathForCell:
 – indexPathForRowAtPoint:
 – indexPathsForRowsInRect:
 – visibleCells
 – indexPathsForVisibleRows
 Scrolling the Table View
 – scrollToRowAtIndexPath:atScrollPosition:animated:
 – scrollToNearestSelectedRowAtScrollPosition:animated:
 Managing Selections
 – indexPathForSelectedRow
 – indexPathsForSelectedRows
 – selectRowAtIndexPath:animated:scrollPosition:
 – deselectRowAtIndexPath:animated:
 allowsSelection  property
 allowsMultipleSelection  property
 allowsSelectionDuringEditing  property
 allowsMultipleSelectionDuringEditing  property
 Inserting, Deleting, and Moving Rows and Sections
 – beginUpdates
 – endUpdates
 – insertRowsAtIndexPaths:withRowAnimation:
 – deleteRowsAtIndexPaths:withRowAnimation:
 – moveRowAtIndexPath:toIndexPath:
 – insertSections:withRowAnimation:
 – deleteSections:withRowAnimation:
 – moveSection:toSection:
 Managing the Editing of Table Cells
 editing  property
 – setEditing:animated:
 Reloading the Table View
 – reloadData
 – reloadRowsAtIndexPaths:withRowAnimation:
 – reloadSections:withRowAnimation:
 – reloadSectionIndexTitles
 Accessing Drawing Areas of the Table View
 – rectForSection:
 – rectForRowAtIndexPath:
 – rectForFooterInSection:
 – rectForHeaderInSection:
 Managing the Delegate and the Data Source
 dataSource  property
 delegate  property
 Configuring the Table Index
 sectionIndexMinimumDisplayRowCount  property
 sectionIndexColor  property
 sectionIndexTrackingBackgroundColor  property
 
 */

#import "EXTVV2ViewController.h"

@interface EXTVV2ViewController ()
@property (nonatomic) NSMutableArray *listData;
@property (nonatomic) IBOutlet UITableView* myTableView;//在xib中与tableview控件关联
@property (nonatomic) IBOutlet UISwitch* mySwitch;//在xib中与switch控件关联
-(IBAction)switchEditModel:(UISwitch*)sender;//在xib中与switch控件的事件关联
@end

@implementation EXTVV2ViewController
@synthesize listData;
@synthesize myTableView;
@synthesize mySwitch;

- (void)viewDidLoad
{
    [superviewDidLoad];
    
// Do any additional setup after loading the view, typically from a nib.
    [selfsetListData:[selfcreateData:26sectionRowLength:10stringLength:6]];
}

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

//指定有多少个分区(Section),默认为1
/*
 1.此处根据二维数组外层的count获取section数量
 此时已有count个section被创建
 */
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return [self.listDatacount];
}


//指定各个分区中有多少行,默认为1。
/*
 2.此处根据1设置的section数量获取数组二维内层长度(row数量)ps:section会根据你设置的最大值自动递增
 此时section对应的count个cell被创建
 */
- (NSInteger) tableView: (UITableView *) tableView
  numberOfRowsInSection: (NSInteger) section {
    NSInteger rowCount = 0;
    //NSLog(@"section = %d",section);0/1/2
    if (section < self.listData.count) {
        rowCount = [self.listData[section]count];
    }
    return rowCount;
}

//设置每行调用的cell
/*
 3.此处根据1设置的section数量,和2设置的row数量获取数组内容并填充cell
 对1、2创建的容器进行填充,section和row就是二维数组的下标
 */
- (UITableViewCell *) tableView: (UITableView *) tableView
          cellForRowAtIndexPath: (NSIndexPath *) indexPath
{
    /*
     indexPath 索引路径
     property:
     row:table view 中
     item:collection view中
     section:table/collection view中
     method
     //collection view中
     + (NSIndexPath *)indexPathForItem:(NSInteger)item inSection:(NSInteger)section
     //table view 中
     + (NSIndexPath *)indexPathForRow:(NSInteger)row inSection:(NSInteger)section
     
     */
    
    //产生一个静态标示(每个cell形式相同可用)
    //static NSString * TableSampleIdentifier = @ "TableSampleIdentifier";
    //每个cell形式不相同需要不同标示
    NSString * TableSampleIdentifier = [[NSStringalloc]initWithFormat:@"CMainCell%d", indexPath.row];
    
    //通过标示符获取一个cell对象(dequeueReusableCellWithIdentifier=>系统请求的回调函数)
    UITableViewCell * cell = [tableViewdequeueReusableCellWithIdentifier:
                              TableSampleIdentifier];
    //如果未获取到cell对象,创建新的cell对象,并赋予标示符
    if (cell == nil) {
        cell = [[UITableViewCellalloc]
                initWithStyle:UITableViewCellStyleDefault
                reuseIdentifier: TableSampleIdentifier];
    }
    NSString* cellText = nil;
    if (indexPath.section <self.listData.count) {
        NSArray* rowArray = self.listData[indexPath.section];
        if ([indexPath row] < rowArray.count) {
            cellText = rowArray[indexPath.row];
        }
    }
    cell.textLabel.text = cellText;
    return cell;
}

//设置每个section显示的Title
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section
{
    NSString* title = nil;
    if (section < self.listData.count) {
        NSArray* rowArray = self.listData[section];
        if (rowArray.count >0) {
            //将每个section的第一行作为title是惯例
            title = rowArray[0];
        }
    }
    //截取首字母
    return [titlesubstringToIndex:1];
}

//设置tableview每行的title(右侧索引)
- (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView{
    //initWithCapacity初始化数组时候指定长度
    NSMutableArray* indexTitleArray = [[NSMutableArrayalloc]initWithCapacity:[self.listDatacount]];
    //循环外围数组(section个数)
    for (UInt16 i =0; i < [self.listDatacount]; i++) {
        NSArray* rowArray = self.listData[i];
        //判断section下的数据行是否大于0
        if (rowArray.count >0) {
            NSString* titleStr = rowArray[0];
            //title长度超过3截取字符串
            if (titleStr.length >1) {
                titleStr = [titleStr substringToIndex:1];
            }
            [indexTitleArray addObject:titleStr];
        }
    }
    //arrayWithArray产生一个新数组并释放原来的数组
    return [NSArrayarrayWithArray:indexTitleArray];
}

//点击右侧索引时响应跳转到那个section的事件
- (NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index
{
    return index;
}


//设置选中Cell的响应事件
/*
 -(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
 {
 [tableView deselectRowAtIndexPath:indexPath animated:YES];//选中后的反显颜色即刻消失
 }
 */

//选中之前执行
-(NSIndexPath*)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    return indexPath;
}

//设置划动cell是否出现del按钮
-(BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath
{
    return YES;
}

//设置删除时编辑状态
-(void)tableView:(UITableView *)tableView  commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
    //删除元素的操作
    if (editingStyle ==UITableViewCellEditingStyleDelete)
    {
        //删除数据
        [self.listData[indexPath.section]removeObjectAtIndex:indexPath.row];
        //删除元素
        [tableView deleteRowsAtIndexPaths:[NSMutableArrayarrayWithObjects:indexPath,nil]withRowAnimation:UITableViewRowAnimationTop];
        
    }
}

//选中cell后触发的事件
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    
    //设置选中的样式,4种风格 UITableViewCellAccessoryCheckmark UITableViewCellAccessoryDetailDisclosureButton
    //UITableViewCellAccessoryDisclosureIndicator UITableViewCellAccessoryNone
    UITableViewCell *cellView = [tableView cellForRowAtIndexPath:indexPath];
    if (cellView.accessoryType ==UITableViewCellAccessoryNone) {
        cellView.accessoryType=UITableViewCellAccessoryCheckmark;
    }
    else {
        cellView.accessoryType =UITableViewCellAccessoryNone;
        [tableView deselectRowAtIndexPath:indexPathanimated:YES];
    }
    
    //弹出框
    NSString *cellSelected=[self.listData[indexPath.section]objectAtIndex:indexPath.row];
    //indexPath.row得到选中的行号,提取出在数组中的内容。
    UIAlertView *myAlertView;
    myAlertView = [[UIAlertViewalloc]initWithTitle:@"你选中了:" message:cellSelected delegate:selfcancelButtonTitle:@"ok"otherButtonTitles:nil];
    //点击后弹出该对话框。
    [myAlertView show];
    
}

//是否能移动
- (BOOL)tableView:(UITableView *)tableView canMoveRowAtIndexPath:(NSIndexPath *)indexPath {
    return YES;
}

//移动操作
- (void)tableView:(UITableView *)tableView moveRowAtIndexPath:(NSIndexPath *)sourceIndexPath toIndexPath:(NSIndexPath *)destinationIndexPath
{
    if (sourceIndexPath != destinationIndexPath) {
        id object = [self.listData[sourceIndexPath.section]objectAtIndex:sourceIndexPath.row];
        [self.listData[sourceIndexPath.section]removeObjectAtIndex:sourceIndexPath.row];
        if (destinationIndexPath.row > [self.listData[destinationIndexPath.section]count]) {
            [self.listData[destinationIndexPath.section]addObject:object];
        }
        else {
            [self.listData[destinationIndexPath.section]insertObject:objectatIndex:destinationIndexPath.row];
        }
    }
}

//单元格返回的编辑风格,包括删除 添加和默认  和不可编辑三种风格
//-(UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSIndexPath *)indexPath
//{
//return UITableViewCellEditingStyleDelete;
//return UITableViewCellEditingStyleNone;
//return UITableViewCellEditingStyleInsert;
//}

//switc按钮事件
-(IBAction)switchEditModel:(UISwitch*)sender
{
    //self.view.subview所有子视图,包括tableview等
    //是否开启编辑模式
    if(sender.on) {
        [self.myTableViewsetEditing:YESanimated:YES];
    } else {
        [self.myTableViewsetEditing:NOanimated:YES];
    }
    
}


//生成随机字符串
- (NSString *) createRandString:(NSInteger)stringLength perStr:(UInt16)pstr{
    UInt16 seed = 0;
    //97-122小写英语
    NSMutableString *str = [[NSMutableStringalloc]initWithFormat:@"%c", pstr];
    for(UInt16 i = 0; i < stringLength; i++) {
        seed = (arc4random() % 26) + 97;
        [str appendFormat:@"%c", seed];
    }
    return [NSStringstringWithString:str];
}

- (NSMutableArray *) createData:(NSInteger)sectionLength sectionRowLength:(NSInteger)row stringLength:(NSInteger)length{
    NSMutableArray *sectionData = [[NSMutableArrayalloc]initWithCapacity:sectionLength];
    for (UInt16 i =0; i < sectionLength ; i++) {
        NSMutableArray* rowData = [[NSMutableArrayalloc]initWithCapacity:row];
        for (UInt16 j =0; j < row; j++) {
            [rowData addObject:[selfcreateRandString:lengthperStr:i +97]];
        }
        [sectionData addObject:rowData];
    }
    return sectionData;
}
@end

 类似资料: