oc UITableView 列表

该代码示例展示了如何在Objective-C中设置UITableView的数据源,包括不同section的行数,显示内容,以及使用模型进行优化。通过创建XMGCarGroup和TableCar模型,简化了数据处理,提高了代码可读性。
摘要由CSDN通过智能技术生成

 

//
//  ViewController.m
//  OcDemoTest
//
//  Created by Mac on 2023/7/14.
//

#import "ViewController.h"
// 添加协议
@interface ViewController ()<UITableViewDataSource>
@property (weak, nonatomic) IBOutlet UITableView *tableView;



@end


@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // 设置数据源
    self.tableView.dataSource = self;
    
    
}
// tableView 一共有多少组数据
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
    return 4;
    
}
// tableview第section组有多少行
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
    if(section == 0){
        return 2;
    }else if (section ==1){
        return 6;
        
    }else if(section == 2){
        return 6;
    }else{
        return 1;
    }
    
   
    
}
// 显示内容
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    UITableViewCell *cell = [[UITableViewCell alloc]init];
    if(indexPath.section == 0){ // 第0组
        if(indexPath.row == 0){ // 第0组第0行
            cell.textLabel.text = @"通用";
        }else if(indexPath.row == 1){
            cell.textLabel.text = @"隐私";
            
        }
    }else{
        cell.textLabel.text = [NSString stringWithFormat:@"%ld组%zd行-其他数据",indexPath.section,indexPath.row];
    }
    
    return cell;
    
}


@end

cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;

 

 自定义view

cell.accessoryView = [[UISwitch alloc]init];

 

 

//
//  ViewController.m
//  OcDemoTest
//
//  Created by Mac on 2023/7/14.
//

#import "ViewController.h"
// 添加协议
@interface ViewController ()<UITableViewDataSource>
@property (weak, nonatomic) IBOutlet UITableView *tableView;



@end


@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // 设置数据源
    self.tableView.dataSource = self;
    // 设置头部和尾部的高度
    self.tableView.sectionFooterHeight = 30;
    self.tableView.sectionHeaderHeight = 30;
    // 这个属性可以设置所有的行高,通过这个属性设置的行高都一样
    self.tableView.rowHeight = 40;
    
    
}
// tableView 一共有多少组数据
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
    return 2;
    
}
// tableview第section组有多少行
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
    if(section == 0){
        return 2;
    }else{
        return 3;
    }
    
   
    
}
// 显示内容
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    UITableViewCell *cell = [[UITableViewCell alloc]init];
    // 右侧有箭头
    cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
    // 设置cell右边显示的控件
    //cell.accessoryView = [[UISwitch alloc]init];
    if(indexPath.section == 0){ // 第0组
        if(indexPath.row == 0){ // 第0组第0行
            cell.textLabel.text = @"奔驰";
            cell.imageView.image = [UIImage imageNamed:@"m_2_100"];
        }else if(indexPath.row == 1){
            cell.textLabel.text = @"宝马";
            cell.imageView.image = [UIImage imageNamed:@"m_3_100"];
            
        }
    }else if(indexPath.section == 1){
        if(indexPath.row == 0){ // 第0组第0行
            cell.textLabel.text = @"丰田";
            cell.imageView.image = [UIImage imageNamed:@"m_7_100"];
        }else if(indexPath.row ==1){
            cell.textLabel.text = @"马自达";
            cell.imageView.image = [UIImage imageNamed:@"m_18_100"];
        }else if(indexPath.row ==2){
            cell.textLabel.text = @"本田";
            cell.imageView.image = [UIImage imageNamed:@"m_26_100"];
        }
    }
    
    return cell;
    
}

// 每一个组头部标题
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section{
    if(section == 0){
        return @"德系品牌";
    }else{
        return @"日系品牌";
    }
    
}
// 每一个组尾部标题
- (NSString *)tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger)section{
    if(section == 0){
        return @"德系品牌footer";
    }else{
        return @"日系品牌footer";
    }
}

// 设置section footer的高度



@end

 优化代码。使用模型

 

 

 

//
//  ViewController.m
//  OcDemoTest
//
//  Created by Mac on 2023/7/14.
//

#import "ViewController.h"
#import "XMGCarGroup.h"
#import "TableCar.h"
// 添加协议
@interface ViewController ()<UITableViewDataSource>
@property (weak, nonatomic) IBOutlet UITableView *tableView;

@property(nonatomic,assign) int count;

@property(nonatomic,strong) NSArray *carGroups;



@end


@implementation ViewController

// 懒加载
-(NSArray *)carGroups{
    if(!_carGroups){
        XMGCarGroup *group0 = [[XMGCarGroup alloc]init];
        group0.header = @"德系品牌";
        group0.footer = @"德系品牌XXXX";
        group0.cart = @[
           [TableCar carWithName:@"奔驰" icon:@"m_2_100"],
           [TableCar carWithName:@"宝马" icon:@"m_3_100"],
        ];
        
        XMGCarGroup *group1 = [[XMGCarGroup alloc]init];
        group1.header = @"日系品牌";
        group1.footer = @"日系品牌XXXX";
        group1.cart = @[
           [TableCar carWithName:@"丰田" icon:@"m_1_100"],
           [TableCar carWithName:@"马自达" icon:@"m_18_100"],
           [TableCar carWithName:@"本田" icon:@"m_26_100"],
        ];
        _carGroups = @[group0,group1];
    }
    return _carGroups;
}

- (void)viewDidLoad {
    [super viewDidLoad];
    // 设置数据源
    self.tableView.dataSource = self;
    // 设置头部和尾部的高度
    self.tableView.sectionFooterHeight = 30;
    self.tableView.sectionHeaderHeight = 30;
    // 这个属性可以设置所有的行高,通过这个属性设置的行高都一样
    self.tableView.rowHeight = 40;
    
    
}
// tableView 一共有多少组数据
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
    return self.carGroups.count;
    
}
// tableview第section组有多少行
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
//    if(section == 0){
//        return 2;
//    }else{
//        return 3;
//    }
    // 取出section组的组模型
    XMGCarGroup *group = self.carGroups[section];
    return group.cart.count;
   
    
}
// 显示内容
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
    
//    NSString *name =nil;
//    NSString *icon = nil;
    UITableViewCell *cell = [[UITableViewCell alloc]init];
    // 右侧有箭头
    cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
    // 设置cell右边显示的控件
    //cell.accessoryView = [[UISwitch alloc]init];
//    if(indexPath.section == 0){ // 第0组
//        if(indexPath.row == 0){ // 第0组第0行
//            name = @"奔驰";
//            icon = @"m_2_100";
//        }else if(indexPath.row == 1){
//            name = @"宝马";
//            icon = @"m_3_100";
//
//        }
//    }else if(indexPath.section == 1){
//        if(indexPath.row == 0){ // 第0组第0行
//            name = @"丰田";
//            icon = @"m_7_100";
//        }else if(indexPath.row ==1){
//           name = @"马自达";
//            icon = @"m_18_100";
//        }else if(indexPath.row ==2){
//            name = @"本田";
//            icon = @"m_26_100";
//        }
//    }
    // 取出indexPath.section 组模型
    XMGCarGroup *group = self.carGroups[indexPath.section];
    // 取出indexpath.row 对应的车模型
    TableCar *car = group.cart[indexPath.row];
    cell.textLabel.text = car.name;
    cell.imageView.image = [UIImage imageNamed:car.icon];
    
    return cell;
    
}

// 每一个组头部标题
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section{
    // 取出indexPath.section 组模型
    XMGCarGroup *group = self.carGroups[section];
    return group.header;
    // 取出indexpath.row 对应的车模型
    
}
// 每一个组尾部标题
- (NSString *)tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger)section{
    XMGCarGroup *group = self.carGroups[section];
    return group.footer;
}

// 设置section footer的高度



@end

 

以下是一个简单的通讯录列表OC代码实现: ``` // Contact.h #import <Foundation/Foundation.h> @interface Contact : NSObject @property (nonatomic, copy) NSString *name; @property (nonatomic, copy) NSString *phone; - (instancetype)initWithName:(NSString *)name phone:(NSString *)phone; @end // Contact.m #import "Contact.h" @implementation Contact - (instancetype)initWithName:(NSString *)name phone:(NSString *)phone { self = [super init]; if (self) { self.name = name; self.phone = phone; } return self; } @end // ContactCell.h #import <UIKit/UIKit.h> @interface ContactCell : UITableViewCell @property (nonatomic, strong) UILabel *nameLabel; @property (nonatomic, strong) UILabel *phoneLabel; @end // ContactCell.m #import "ContactCell.h" @implementation ContactCell - (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier { self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]; if (self) { self.nameLabel = [[UILabel alloc] initWithFrame:CGRectMake(15, 10, 200, 20)]; [self.contentView addSubview:self.nameLabel]; self.phoneLabel = [[UILabel alloc] initWithFrame:CGRectMake(15, 35, 200, 20)]; [self.contentView addSubview:self.phoneLabel]; } return self; } @end // ContactListViewController.h #import <UIKit/UIKit.h> @interface ContactListViewController : UITableViewController @end // ContactListViewController.m #import "ContactListViewController.h" #import "Contact.h" #import "ContactCell.h" @interface ContactListViewController () @property (nonatomic, strong) NSMutableArray<Contact *> *contacts; @end @implementation ContactListViewController - (void)viewDidLoad { [super viewDidLoad]; self.navigationItem.title = @"Contacts"; UIBarButtonItem *addButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(addContact)]; self.navigationItem.rightBarButtonItem = addButton; self.contacts = [NSMutableArray array]; Contact *contact1 = [[Contact alloc] initWithName:@"John Smith" phone:@"555-1234"]; [self.contacts addObject:contact1]; Contact *contact2 = [[Contact alloc] initWithName:@"Jane Doe" phone:@"555-5678"]; [self.contacts addObject:contact2]; [self.tableView registerClass:[ContactCell class] forCellReuseIdentifier:@"ContactCell"]; } #pragma mark - Table view data source - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return self.contacts.count; } - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { ContactCell *cell = [tableView dequeueReusableCellWithIdentifier:@"ContactCell" forIndexPath:indexPath]; Contact *contact = self.contacts[indexPath.row]; cell.nameLabel.text = contact.name; cell.phoneLabel.text = contact.phone; return cell; } #pragma mark - Actions - (void)addContact { UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"Add Contact" message:nil preferredStyle:UIAlertControllerStyleAlert]; [alert addTextFieldWithConfigurationHandler:^(UITextField * _Nonnull textField) { textField.placeholder = @"Name"; }]; [alert addTextFieldWithConfigurationHandler:^(UITextField * _Nonnull textField) { textField.placeholder = @"Phone"; }]; UIAlertAction *addAction = [UIAlertAction actionWithTitle:@"Add" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) { UITextField *nameField = alert.textFields[0]; UITextField *phoneField = alert.textFields[1]; Contact *contact = [[Contact alloc] initWithName:nameField.text phone:phoneField.text]; [self.contacts addObject:contact]; [self.tableView reloadData]; }]; UIAlertAction *cancelAction = [UIAlertAction actionWithTitle:@"Cancel" style:UIAlertActionStyleCancel handler:nil]; [alert addAction:addAction]; [alert addAction:cancelAction]; [self presentViewController:alert animated:YES completion:nil]; } @end ``` 在这个实现中,我们创建了一个`Contact`类来表示每个联系人,一个`ContactCell`类来自定义通讯录列表中的单元格,一个`ContactListViewController`类来管理通讯录列表。我们使用`NSMutableArray`来存储所有的联系人,并在视图加载时向其中添加了一些示例联系人。 在`ContactListViewController`中,我们实现了`UITableViewDataSource`协议和`UITableViewDelegate`协议中的方法来显示通讯录列表和处理用户添加新联系人的操作。我们还添加了一个`UIBarButtonItem`,当用户点击它时会出现一个`UIAlertController`来允许用户输入新联系人的信息。最后,我们在`viewDidLoad`方法中注册了`ContactCell`类以供表视图使用。 这只是一个简单的例子,你可以根据自己的需要对其进行修改和扩展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值