开源 Objective-C IOS 应用开发(九)复杂控件-tableview

文章的目的为了记录使用Objective-C 进行IOS app 开发学习的经历。本职为嵌入式软件开发,公司安排开发app,临时学习,完成app的开发。开发流程和要点有些记忆模糊,赶紧记录,防止忘记。

相关链接:

开源 Objective-C IOS 应用开发(一)macOS 的使用

开源 Objective-C IOS 应用开发(二)Xcode安装

开源 Objective-C IOS 应用开发(三)第一个iPhone的APP

开源 Objective-C IOS 应用开发(四)Xcode工程文件结构

开源 Objective-C IOS 应用开发(五)iOS操作(action)和输出口(Outlet)

推荐链接:

开源 Arkts 鸿蒙应用 开发(一)工程文件分析-CSDN博客

开源 Arkts 鸿蒙应用 开发(二)封装库.har制作和应用-CSDN博客

开源 Arkts 鸿蒙应用 开发(三)Arkts的介绍-CSDN博客

开源 Arkts 鸿蒙应用 开发(四)布局和常用控件-CSDN博客

开源 Arkts 鸿蒙应用 开发(五)控件组成和复杂控件-CSDN博客

开源 Arkts 鸿蒙应用 开发(六)数据持久--文件和首选项存储-CSDN博客

开源 Arkts 鸿蒙应用 开发(七)数据持久--sqlite关系数据库-CSDN博客

开源 Arkts 鸿蒙应用 开发(八)多媒体--相册和相机-CSDN博客

开源 Arkts 鸿蒙应用 开发(九)通讯--tcp客户端-CSDN博客

开源 Arkts 鸿蒙应用 开发(十)通讯--Http-CSDN博客

开源 Arkts 鸿蒙应用 开发(十一)证书和包名修改-CSDN博客

开源 Arkts 鸿蒙应用 开发(十二)传感器的使用-CSDN博客

开源 Arkts 鸿蒙应用 开发(十三)音频--MP3播放_arkts avplayer播放音频 mp3-CSDN博客

开源 Arkts 鸿蒙应用 开发(十四)线程--任务池(taskpool)-CSDN博客

开源 Arkts 鸿蒙应用 开发(十五)自定义绘图控件--仪表盘-CSDN博客

开源 Arkts 鸿蒙应用 开发(十六)自定义绘图控件--波形图-CSDN博客

开源 Arkts 鸿蒙应用 开发(十七)通讯--http多文件下载-CSDN博客

开源 Arkts 鸿蒙应用 开发(十八)通讯--Ble低功耗蓝牙服务器-CSDN博客

推荐链接:

开源 java android app 开发(一)开发环境的搭建-CSDN博客

开源 java android app 开发(二)工程文件结构-CSDN博客

开源 java android app 开发(三)GUI界面布局和常用组件-CSDN博客

开源 java android app 开发(四)GUI界面重要组件-CSDN博客

开源 java android app 开发(五)文件和数据库存储-CSDN博客

开源 java android app 开发(六)多媒体使用-CSDN博客

开源 java android app 开发(七)通讯之Tcp和Http-CSDN博客

开源 java android app 开发(八)通讯之Mqtt和Ble-CSDN博客

开源 java android app 开发(九)后台之线程和服务-CSDN博客

开源 java android app 开发(十)广播机制-CSDN博客

开源 java android app 开发(十一)调试、发布-CSDN博客

开源 java android app 开发(十二)封库.aar-CSDN博客

本章内容主要使用Objective-C语言进行tableview控件的开发和演示。

目录:

1.手机演示

2.所有源码

3.源码分析

一、手机演示

二、所有源码

所需添加和修改文件

Employee.h文件代码

复制代码
//
//  Employee.h
//  tableview
//
//  
//
#import <Foundation/Foundation.h>

@interface Employee : NSObject

@property (nonatomic, assign) NSInteger employeeId;
@property (nonatomic, copy) NSString *name;
@property (nonatomic, assign) NSInteger age;
@property (nonatomic, copy) NSString *department;

- (instancetype)initWithId:(NSInteger)employeeId name:(NSString *)name age:(NSInteger)age department:(NSString *)department;

@end

Employee.m文件源码

复制代码
//
//  Employee.m
//  tableview
//
//  
//
#import "Employee.h"

@implementation Employee

- (instancetype)initWithId:(NSInteger)employeeId name:(NSString *)name age:(NSInteger)age department:(NSString *)department {
    self = [super init];
    if (self) {
        _employeeId = employeeId;
        _name = [name copy];
        _age = age;
        _department = [department copy];
    }
    return self;
}

@end

EmployeeTableViewController.h文件源码

复制代码
//
//  EmployeeTableViewController.h
//  tableview
//
//  
//
#import <UIKit/UIKit.h>

@interface EmployeeTableViewController : UIViewController <UITableViewDataSource, UITableViewDelegate>

@end

EmployeeTableViewController.m文件源码

复制代码
#import "EmployeeTableViewController.h"
#import "Employee.h"

@interface EmployeeTableViewController ()

@property (nonatomic, strong) UITableView *tableView;
@property (nonatomic, strong) NSArray<Employee *> *employees;

@end

@implementation EmployeeTableViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
    [self setupUI];
    [self setupData];
    [self setupTableView];
}

- (void)setupUI {
    self.title = @"员工列表";
    self.view.backgroundColor = [UIColor systemBackgroundColor];
}

- (void)setupData {
    // 创建9个员工数据
    NSMutableArray *employeesArray = [NSMutableArray array];
    
    NSArray *names = @[@"张三", @"李四", @"王五", @"赵六", @"钱七", @"孙八", @"周九", @"吴十", @"郑十一"];
    NSArray *departments = @[@"技术部", @"销售部", @"市场部", @"人事部", @"财务部", @"研发部", @"运营部", @"产品部", @"客服部"];
    
    for (int i = 0; i < 9; i++) {
        Employee *employee = [[Employee alloc] initWithId:i + 1
                                                    name:names[i]
                                                     age:25 + i
                                              department:departments[i]];
        [employeesArray addObject:employee];
    }
    
    self.employees = [employeesArray copy];
}

- (void)setupTableView {
    // 创建 TableView
    self.tableView = [[UITableView alloc] initWithFrame:self.view.bounds style:UITableViewStylePlain];
    self.tableView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
    self.tableView.dataSource = self;
    self.tableView.delegate = self;
    
    // 设置 TableView 属性
    self.tableView.rowHeight = 70;
    self.tableView.separatorInset = UIEdgeInsetsZero;
    
    // 注册单元格
    [self.tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"EmployeeCell"];
    
    [self.view addSubview:self.tableView];
}

#pragma mark - UITableViewDataSource

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return self.employees.count;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"EmployeeCell" forIndexPath:indexPath];
    
    Employee *employee = self.employees[indexPath.row];
    
    // 配置单元格内容
    cell.textLabel.text = [NSString stringWithFormat:@"%ld. %@", (long)employee.employeeId, employee.name];
    cell.detailTextLabel.text = [NSString stringWithFormat:@"年龄: %ld岁 | 部门: %@", (long)employee.age, employee.department];
    
    // 设置样式
    cell.textLabel.font = [UIFont systemFontOfSize:16 weight:UIFontWeightMedium];
    cell.detailTextLabel.font = [UIFont systemFontOfSize:14];
    cell.detailTextLabel.textColor = [UIColor grayColor];
    
    // 添加右侧箭头
    cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
    
    return cell;
}

#pragma mark - UITableViewDelegate

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    [tableView deselectRowAtIndexPath:indexPath animated:YES];
    
    Employee *employee = self.employees[indexPath.row];
    
    // 创建弹窗显示详细信息
    UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"员工详细信息"
                                                                   message:[NSString stringWithFormat:@"工号: %ld\n姓名: %@\n年龄: %ld岁\n部门: %@",
                                                                            (long)employee.employeeId,
                                                                            employee.name,
                                                                            (long)employee.age,
                                                                            employee.department]
                                                            preferredStyle:UIAlertControllerStyleAlert];
    
    UIAlertAction *okAction = [UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleDefault handler:nil];
    [alert addAction:okAction];
    
    [self presentViewController:alert animated:YES completion:nil];
}

// 设置行高
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    return 70.0;
}

@end

SceneDelegate.h文件源码

复制代码
#import <UIKit/UIKit.h>

@interface SceneDelegate : UIResponder <UIWindowSceneDelegate>

// 需要保留 window 属性,否则会被释放
@property (strong, nonatomic) UIWindow *window;

@end

SceneDelegate.m文件

复制代码
#import "SceneDelegate.h"
#import "EmployeeTableViewController.h"

@implementation SceneDelegate

- (void)scene:(UIScene *)scene willConnectToSession:(UISceneSession *)session options:(UISceneConnectionOptions *)connectionOptions {
    
    // 确保是 UIWindowScene 类型
    if (![scene isKindOfClass:[UIWindowScene class]]) return;
    
    UIWindowScene *windowScene = (UIWindowScene *)scene;
    
    // 创建窗口并保存到属性
    self.window = [[UIWindow alloc] initWithWindowScene:windowScene];
    self.window.frame = windowScene.coordinateSpace.bounds;
    
    // 创建员工表格控制器
    EmployeeTableViewController *employeeVC = [[EmployeeTableViewController alloc] init];
    
    // 创建导航控制器
    UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:employeeVC];
    
    // 配置导航栏
    if (@available(iOS 13.0, *)) {
        UINavigationBarAppearance *appearance = [[UINavigationBarAppearance alloc] init];
        [appearance configureWithOpaqueBackground];
        appearance.backgroundColor = [UIColor systemBackgroundColor];
        navController.navigationBar.standardAppearance = appearance;
        navController.navigationBar.scrollEdgeAppearance = appearance;
    }
    
    // 设置大标题
    navController.navigationBar.prefersLargeTitles = YES;
    
    // 设置根控制器并显示窗口
    self.window.rootViewController = navController;
    self.window.backgroundColor = [UIColor systemBackgroundColor];
    [self.window makeKeyAndVisible];
}

@end

ViewController.h文件源码

复制代码
//
//  ViewController.h
//  tableview
//
//  
//

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController


@end

ViewController.m文件源码

复制代码
//
//  ViewController.m
//  tableview
//
//  
//

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    
    
    
}


@end

三、源码分析

  1. Employee 数据模型类

Employee.h

objc

// 定义属性

@property (nonatomic, assign) NSInteger employeeId; // 员工ID

@property (nonatomic, copy) NSString *name; // 姓名

@property (nonatomic, assign) NSInteger age; // 年龄

@property (nonatomic, copy) NSString *department; // 部门

// 初始化方法

  • (instancetype)initWithId:(NSInteger)employeeId name:(NSString *)name age:(NSInteger)age department:(NSString *)department;

Employee.m

objc

// 初始化函数实现

  • (instancetype)initWithId:(NSInteger)employeeId name:(NSString *)name age:(NSInteger)age department:(NSString *)department {

self = super init;

if (self) {

_employeeId = employeeId; // 设置员工ID

_name = name copy; // 拷贝姓名(确保线程安全)

_age = age; // 设置年龄

_department = department copy; // 拷贝部门

}

return self;

}

  1. EmployeeTableViewController 主控制器

初始化相关函数

objc

// 视图加载完成时调用

  • (void)viewDidLoad {

super viewDidLoad;

self setupUI; // 设置界面

self setupData; // 初始化数据

self setupTableView; // 设置表格视图

}

// 设置界面外观

  • (void)setupUI {

self.title = @"员工列表"; // 设置导航栏标题

self.view.backgroundColor = UIColor systemBackgroundColor; // 设置背景色

}

// 初始化员工数据

  • (void)setupData {

NSMutableArray *employeesArray = NSMutableArray array;

NSArray *names = @@"张三", @"李四", @"王五", ...; // 姓名数组

NSArray *departments = @@"技术部", @"销售部", @"市场部", ...; // 部门数组

// 循环创建9个员工对象

for (int i = 0; i < 9; i++) {

Employee *employee = \[Employee alloc initWithId:i + 1

name:namesi

age:25 + i // 年龄递增

department:departmentsi];

employeesArray addObject:employee;

}

self.employees = employeesArray copy; // 转换为不可变数组

}

// 设置表格视图

  • (void)setupTableView {

self.tableView = \[UITableView alloc initWithFrame:self.view.bounds style:UITableViewStylePlain];

self.tableView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;

self.tableView.dataSource = self; // 设置数据源

self.tableView.delegate = self; // 设置代理

self.tableView.rowHeight = 70; // 设置行高

self.tableView.separatorInset = UIEdgeInsetsZero; // 设置分隔线

self.tableView registerClass:\[UITableViewCell class forCellReuseIdentifier:@"EmployeeCell"];

self.view addSubview:self.tableView; // 添加到视图

}

UITableViewDataSource 协议函数

objc

// 返回表格行数

  • (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {

return self.employees.count; // 返回员工数量

}

// 配置表格单元格

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

// 复用单元格

UITableViewCell *cell = tableView dequeueReusableCellWithIdentifier:@"EmployeeCell" forIndexPath:indexPath;

Employee *employee = self.employeesindexPath.row;

// 设置主标题和副标题

cell.textLabel.text = NSString stringWithFormat:@"%ld. %@", (long)employee.employeeId, employee.name;

cell.detailTextLabel.text = NSString stringWithFormat:@"年龄: %ld岁 \| 部门: %@", (long)employee.age, employee.department;

// 设置字体样式

cell.textLabel.font = UIFont systemFontOfSize:16 weight:UIFontWeightMedium;

cell.detailTextLabel.font = UIFont systemFontOfSize:14;

cell.detailTextLabel.textColor = UIColor grayColor;

cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; // 右侧箭头

return cell;

}

UITableViewDelegate 协议函数

objc

// 处理行点击事件

  • (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

tableView deselectRowAtIndexPath:indexPath animated:YES; // 取消选中状态

Employee *employee = self.employeesindexPath.row;

// 创建详情弹窗

UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"员工详细信息"

message:[NSString stringWithFormat:@"工号: %ld\n姓名: %@\n年龄: %ld岁\n部门: %@",

(long)employee.employeeId,

employee.name,

(long)employee.age,

employee.department]

preferredStyle:UIAlertControllerStyleAlert];

UIAlertAction *okAction = UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleDefault handler:nil;

alert addAction:okAction;

self presentViewController:alert animated:YES completion:nil; // 显示弹窗

}

// 设置行高

  • (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {

return 70.0; // 固定行高

}

  1. SceneDelegate 场景代理

objc

// 场景连接时调用

  • (void)scene:(UIScene *)scene willConnectToSession:(UISceneSession *)session options:(UISceneConnectionOptions *)connectionOptions {

if (!scene isKindOfClass:\[UIWindowScene class]) return;

UIWindowScene *windowScene = (UIWindowScene *)scene;

// 创建窗口

self.window = \[UIWindow alloc initWithWindowScene:windowScene];

self.window.frame = windowScene.coordinateSpace.bounds;

// 创建员工列表控制器和导航控制器

EmployeeTableViewController *employeeVC = \[EmployeeTableViewController alloc init];

UINavigationController *navController = \[UINavigationController alloc initWithRootViewController:employeeVC];

// 配置导航栏外观

if (@available(iOS 13.0, *)) {

UINavigationBarAppearance *appearance = \[UINavigationBarAppearance alloc init];

appearance configureWithOpaqueBackground;

appearance.backgroundColor = UIColor systemBackgroundColor;

navController.navigationBar.standardAppearance = appearance;

navController.navigationBar.scrollEdgeAppearance = appearance;

}

navController.navigationBar.prefersLargeTitles = YES; // 启用大标题

// 设置根控制器并显示窗口

self.window.rootViewController = navController;

self.window.backgroundColor = UIColor systemBackgroundColor;

self.window makeKeyAndVisible;

}

代码结构总结

  1. 数据层:Employee 类负责封装员工数据

  2. 表示层:EmployeeTableViewController 负责界面显示和用户交互

  3. 应用层:SceneDelegate 负责应用启动和窗口管理

  4. 架构模式:采用 MVC 模式,数据、视图、控制器分离

相关推荐
Cutecat_10 分钟前
视频字幕处理工具横向:提取模式 vs 编辑模式,该如何选择
android·前端·ios·语音识别
学术头条2 小时前
清华团队开源SCAIL-2:角色动画告别骨骼依赖,端到端还原视频中动作细节
人工智能·科技·机器学习·ai·开源·音视频·agi
comcoo2 小时前
电脑自动干活不用值守!OpenClaw 本地部署完整实操流程
windows·开源·github·open claw部署·open claw部署包
大熊猫侯佩5 小时前
WWDC26 SwiftUI 进化之路:砸碎黑盒,彻底迎来开发自由!
ios·swiftui·swift
namexingyun6 小时前
开源前端生态如何成为 AI UI 生成的“燃料“:shadcn/ui、Tailwind CSS、Storybook 技术价值全解剖
java·前端·人工智能·python·ui·开源·ai编程
字节跳动的猫6 小时前
2026年国内开源商城系统推荐:LikeShop、CRMEB、ShopXO、Mall4j、TigShop深度对比
开源
Hommy886 小时前
【开源剪映小助手】添加特效接口(Add Effects)
开源·github·剪映小助手·视频剪辑自动化
游戏开发爱好者86 小时前
iPhone真机调试有哪些方法?一次定位推送权限问题时整理出来的几种方案
ide·vscode·ios·objective-c·个人开发·swift·敏捷流程
迦蓝叶8 小时前
【开源自荐】JAiRouter:一个轻量级 AI 模型服务网关的开源实践
java·人工智能·spring·开源·llm-gateway·mass