iOS架构-组件化(项目实战-项目首页架构)

2023-11-01

UI架构设计
设计模式:外观模式、代理模式、适配器模式(adapter)

注意:一版本只是搭建结构!

一. 1.0-Tab搭建
在这里插入图片描述
二. 1.1-新增UICollectionView
主页->整体设计基于->UICollectionView(滑动组件)->左右滑动
嵌套->UITableView->上下滑动
数据展示都是动态下发(整体UI排版由服务器配置决定)
json格式(动态编码:动态创建UI)
嵌套->UICollectionView->广告轮播图
普通写法:ViewController->业务代码

#import "HomeViewController.h"

@interface HomeViewController ()<UICollectionViewDelegate,UICollectionViewDataSource,UICollectionViewDelegateFlowLayout>

@property (nonatomic, strong) id dataManager;
@property (nonatomic, strong) NSArray *dataArray;
//选项卡控制器
@property (nonatomic, strong) UIView *tabSegmentedControl;
@property (nonatomic, strong) UICollectionView *collectionView;

@end

@implementation HomeViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    self.view.backgroundColor = [UIColor orangeColor];
    
    _tabSegmentedControl = [UIView new];
    [self.view addSubview:_tabSegmentedControl];
    
    _collectionView = [UICollectionView new];
    _collectionView.delegate = self;
    _collectionView.dataSource = self;
    [self.view addSubview:_collectionView];
}

#pragma mark colloctionView delegate
//cell被选择时被调用
- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath {
}

//每一个cell的大小
- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath {
    return CGSizeMake(collectionView.bounds.size.width, collectionView.bounds.size
                      .height);
}

#pragma mark colloctionView datasource
- (nonnull __kindof UICollectionViewCell *)collectionView:(nonnull UICollectionView *)collectionView cellForItemAtIndexPath:(nonnull NSIndexPath *)indexPath {
    UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"" forIndexPath:indexPath];
    return cell;
}

//collectionView里有多少个组
- (NSInteger)collectionView:(nonnull UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section {
    return _dataArray.count;
}


#pragma mark UICollectionViewDelegateFlowLayout
//cell的最小行间距
- (CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout minimumLineSpacingForSectionAtIndex:(NSInteger)section {
    return 0;
}

//cell的最小列间距
- (CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout minimumInteritemSpacingForSectionAtIndex:(NSInteger)section {
    return 0;
}

//指定inset
- (UIEdgeInsets)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout insetForSectionAtIndex:(NSInteger)section {
    return UIEdgeInsetsZero;
}

@end

在这里插入图片描述
三. 1.2-首页UICollectionView抽象
1、适配器模式 ->iOS当中分别表示什么?
应用场景(本身iOS系统UITableView设计其实就是适配器)
角色一:适配器 ->WTCollectionViewProxy
角色二:被适配者 ->数据(动态下发数据) ->json数据
角色三:目标接口(目标对象)->UI界面(UIButton、UIView) ->UICollectionView
2、代理模式
角色一:目标接口 ->UICollectionViewDelegate, UICollectionViewDataSource
角色二:目标对象 ->UI界面 ->UICollectionView
角色三:代理对象
->父类:WTCollectionViewProxy
子类:HomeCollectionViewProxy
子类:……

功能更新
更新一:
新增UICollectionView抽象
WTCollectionViewProxy
设计模式:代理模式、适配器模式
更新二:
新增UICollectionViewCell
WTCollectionViewCell
在这里插入图片描述
四. 1.3-添加UITabView
注意:设计同样也是采用和UICollectionView一模一样
整体架构设计基于:代理模式、适配器模式
1、适配器模式->iOS当中分别表示什么?
角色一:适配器->WTTableViewProxy
角色二:被适配者->数据(动态下发数据)->json数据
角色三:目标接口(目标对象)->UI界面(UIButton、UIView…)->UITableView
2、代理模式
角色一:目标接口
UITableViewDelegate
UITableViewDataSource
角色二:目标对象
UI界面->UITableView
角色三:代理对象
父类:WTTableViewProxy
子类:HomeTableViewProxy
以此类推……
功能更新
更新一:新增UITableView抽象
WTTableViewProxy
设计模式:代理模式、适配器模式

在这里插入图片描述
五. 1.4-添加UITableViewCell
在这里插入图片描述
六. 1.5-添加Carthage第三库管理

参考:iOS架构-组件化(Carthage管理工具)
在这里插入图片描述
七. 1.6-数据与UI展示
在这里插入图片描述
八. 1.7-添加联动
在这里插入图片描述
九. 1.8-联动完善

十. 1.9-HomeBannerCell轮播器完善

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

iOS架构-组件化(项目实战-项目首页架构) 的相关文章

  • iOS:如何在不降低 fps 的情况下播放音频?

    我正在使用 Sprite Kit 最好使用 Swift 库 为 iOS 9 开发游戏 目前 我正在使用 Singleton 在其中预加载音频文件 每个文件都连接到一个单独的 AVAudioPlayer 实例 这是一个简短的代码片段来了解这个
  • 将 C 转换为 Swift:向 UITextField 添加放大镜图标

    如何在左侧添加一个放大镜图标UITextField 我找到了类似问题的答案here https stackoverflow com questions 11811705 where can i get the magnifying glas
  • TestFlight 提供反馈按钮

    我正在使用 iOS 8 的最新 testflight 版本 我将自己添加为内部测试人员 现在当我使用 testflight 打开应用程序时 我找不到反馈按钮 如果有人有任何线索 请告诉我 您在 Testflight 应用程序中提供反馈 打开
  • 如何使用 iOS 可达性

    我正在开发一个使用网络的 iPhone 应用程序 iPhone 通过 HTTP 请求与我的服务器通信 并且应该可以在 WiFi 和 3G 上运行 我目前使用NSURLConnection initWithRequest向我的服务器发送异步请
  • Flutter - 选择 TextFormField 时键盘不显示

    我目前遇到一个问题 当我选择任何一个时 键盘不会出现TextFormFielda 内的小部件Form小部件 这是表单的代码 位于我的内部CreateAccountForm有状态的小部件 import package flutter mate
  • 无法验证包:721772200.itmsp

    我写这篇文章是因为我有一个严重的问题 我在cartoonsmart 网站上购买了Commander Cool 游戏 然而 一个严重的问题发生了 iTune Connect 验证无法接受该申请 我尝试从两个不同的开发者帐户发布它 但错误仍然发
  • NSCFData isRessized 崩溃?

    我目前在控制台中收到此崩溃日志 2011 08 23 19 18 40 064 App 1697 707 NSCFData isResizable unrecognized selector sent to instance 0x11f1c
  • mgwt - 以编程方式改变方向

    是否可以在 gwt mgwt 应用程序中更改强制执行特定的屏幕方向 可以说我希望用户始终以横向模式使用应用程序 这取决于 是作为phonegap应用程序 而不是在浏览器内部 如果您作为 Web 应用程序运行 则不需要t get any co
  • .showsPhysics 内存泄漏

    我最近花了 5 个小时尝试调试 Spritekit 应用程序中的内存泄漏 应用程序启动后 我注意到内存使用量略有上升 我花了 5 个小时中的 3 个小时挖掘参考资料 了解强与弱的关系ARC https developer apple com
  • `navigator.geolocation.getCurrentPosition()` 在 iOS PWA 上挂起

    我有这个片段 const getCurrentPosition gt new Promise
  • iOS、通用链接、Swift。 continueUserActivity 未调用

    我正在为我们的 iOS 应用程序实现通用链接 这是我的一小部分 AppDelegate private func application application UIApplication openURL url URL sourceApp
  • 如何从 SDK 实现每个会话的 Google Places 自动完成功能?

    是否可以从 Android 和 iOS 应用程序的 place sdk 实现基于会话的自动完成 根据 6 月 11 日生效的新 Google 地图框架定价 对自动完成的请求可以分为基于击键 会话的请求 我找不到描述实施步骤的文档 除了这个参
  • Objective-C UILabel 作为超链接

    我正在尝试做一个UILabel一个链接UIWebView 我怎样才能做一个UILabel作为超链接 您可以使用 UITapGestureRecognizer 它将实现与您想要的类似的功能 UILabel myLabel UILabel al
  • dyld:无法加载插入的库

    当我尝试运行 UI 和单元测试时 出现异常 dyld 无法加载插入的库 private var containers Bundle Application AutoTestingApp app Frameworks IDEBundleInj
  • 为什么 iOS 启动屏幕很慢?

    我的 iOS 应用程序启动屏幕大约需要 3 5 秒 我有一张将在启动屏幕后加载的地图 我的用户必须等待启动屏幕加载 然后再等待 3 秒才能加载地图 有没有办法最大限度地减少启动屏幕时间 基本上这种延迟意味着you在启动过程中做了一些非常错误
  • 从命令行添加 Xcode 开发者帐户

    我正在尝试使用xcodebuild allowProvisioningUpdates在我只能通过命令行访问的计算机 Azure Devops macOS 托管计算机 上 不幸的是 根据man xcodebuild为了使用 allowProv
  • 会话重新启动后 AVcapture 会话启动缓慢

    我有一个主视图控制器 它连接到具有 avcapturesession 的第二个视图控制器 我第一次从主视图控制器转向捕获会话控制器 大约需要 50 毫秒 使用 仪器 检查 然后我从捕获会话返回到主视图控制器 然后从主控制器返回到 avcap
  • UIViewControllerAnimatedTransitioning:旋转更改后黑屏片段

    我已经创建了一个视图控制器转换 只要我不更改设备方向 一切都正常 图 1 显示了应有的屏幕 然后我切换到下一个视图控制器 在其中更改方向 现在我回到第一个视图控制器并再次切换方向 然后我得到的结果如图 2 所示 出现黑色边框 请不要介意屏幕
  • 像 TraceGL 一样分析 Objective C 中的代码路径?

    TraceGL 是一个非常简洁的项目 它允许 JS 程序员跟踪 Javascript 中的代码路径 它看起来像这样 我想为 Objective C 构建类似的东西 我知道运行时使跟踪方法调用变得相当容易 但是我如何跟踪控制流 例如 在上面的
  • ios - 如何声明静态变量? [复制]

    这个问题在这里已经有答案了 C 中声明的静态变量如下 private const string Host http 80dfgf7c22634nbbfb82339d46 cloudapp net private const string S

随机推荐

  • java深度克隆工具类——支持对象和对象集合

    正经学徒 佛系记录 不搞事情 第一步 创建工具类 直接使用commons beanutils实现对象拷贝 引入pom
  • mysql数据库存储逻辑_MySQL逻辑架构及存储引擎简介

    MySQL逻辑架构 并发控制 由锁实现 读锁 也叫共享锁 读锁互相不阻塞 A加锁表后A b c d都能读该表但不能写该表 写锁 也叫排他锁 写锁相互阻塞 A加排他锁后 其他线程不能读写该表 锁粒度 表锁 锁一个表 并发粒度小 代表存储引擎M
  • Blazor 模板化组件开发指南

    翻译自 Waqas Anwar 2021年4月15日的文章 A Developer s Guide To Blazor Templated Components 1 在我之前的一篇文章 Blazor 组件入门指南中 我介绍了组件参数 并向您
  • javascript 转数字:javascript数字相加

    var a 3 var b 98 c a b 想得到c 101 确变成了字符串拼接 得到了398 我该则么做呢 c parseInt a parseInt b
  • #pragma once 与 #ifndef

    在C C 中 使用 include 包含文件的时候 经常使用方法去防止重复引用 产生二义性 通常有两种方式 第一种 ifndef指令方式代码被重复引用 比如说 ifndef CODE BLOCK define CODE BLOCK code
  • 谈文本分类

    本文来自对 文本分类研究综述 汪岿的阅读 文章目录 1 为什么要进行文本分类 2 文本分类的分类 应用 3 当前文本分类面临的挑战 4 文本分类的前景 1 为什么要进行文本分类 在大数据时代 网络上的文本数据日益增长 采用文本分类技术对海量
  • 04-Java框架-MyBatis

    一 MyBatis的介绍 1 1 回顾一下JDBC 下面这个代码是使用JDBC实现基于id查询员工信息 我们来分析分析有什么弊端 public Employee selectById Long id Connection conn null
  • 【解决】pytorch单机多卡问题:ERROR: torch.distributed.elastic.multiprocessing.api:failed

    最近在使用单机多卡进行分布式 DDP 训练时遇到一个错误 ERROR torch distributed elastic multiprocessing api failed 而实际报错的内容是 ValueError sampler opt
  • LeetCode·每日一题·722. 删除注释·模拟

    题目 示例 思路 题意 gt 给定一段代码 将代码中的注释删除并返回 由于注释只有两种类型 字符串 表示行注释 表示 和其右侧的其余字符应该被忽略 字符串 表示一个块注释 它表示直到下一个 非重叠 出现的 之间的所有字符都应该被忽略 阅读顺
  • Vuforia AR学习

    传送门 1 搜索 Vuforia 下载相关 SDK 和 Samples 2 这个就有点坑了 想运行 sample demo 需要把下载好的sample拷贝至sdk目录下的sample文件夹下 如图 3 也可以修改修改 Samples dem
  • Linux中nginx配置ssl证书实现https访问(nginx-1.16.1为例)

    配置ssl证书之前 先准备好SSL证书 至于获取的途径很多 不清楚的可以自行搜索 也可以留言 准备好证书后 找到nginx的安装目录 我的安装位置为 usr local nginx 1 16 1 进入 conf nginx conf 编辑n
  • 数据结构:哈夫曼树算法(内含Select函数算法解析)全网最全解释

    引言 学习数据结构的都应该清楚 哈夫曼树是书章节的最后一个内容 也是相对重要的一个知识 他可以应用在生活的各个例子中 如下图所示 假设有ABCD 四个货物架D货架物品被人购买的概率是20 C货架是 35 B货架是 60 D货架是80 那么显
  • python 数组-(列表遍历)(元素互换)

    lisName 张三丰 李四 王麻子 饭桶 遍历列表中所有元素 print 20 for obj in lisName print obj print 20 通过 下标 索引获取值 for i in range 0 len lisName
  • blender快捷键

    tab 模式切换 可以shift多物体切换 主键盘 1点 2线 3面 按住shift 点击点面 可以多选 或者shift 1 2 3多选 ctrl alt q 四象视图 小键盘1前 3右 7顶 9切换前后 也可以按crl 1后视图 小键盘
  • STL系列之十 全排列(百度迅雷笔试题)

    转载自 http blog csdn net morewindows article details 7370155 全排列在笔试面试中很热门 因为它难度适中 既可以考察递归实现 又能进一步考察非递归的实现 便于区分出考生的水平 所以在百度
  • GlidedShy 第一题 实现自动登录和数据爬取

    python 自动登录 控制以及接管浏览器 爬取信息练习 GlidedShy官网 爬虫练习网站 代码仅供学习参考 功能实现步骤 自动登录 输入账号密码 选择题目 爬取数据 自动提交后返回 验证邮箱 注册时已人工验证 框架 Seleium控制
  • spdlog和fork冲突问题

    遇到个问题 使用spdlog的async logger打印日志 一直都是正常的 但是调用了fork之后就不打印了 先使用打印TODO大法 使用的spdlog的default logger打印 走的console打印 结果发现console打
  • win10 WSL2 Docker 与 Linux Docker

    项目场景 项目场景 用win10 wsl2 docker开发使用GPU tensorflow onnx TensorRT 的镜像 然后部署到Linux生产环境进行使用 发现不识别cuda驱动 问题描述 在Linux上运行wsl2 save
  • 优化算法基本原理

    优化算法基本原理 机器学习就两个问题 一个是model的定义 一个就是如何优化 model是战略 优化则是执行 在Caffe现在的版本中 主要使用了三种优化算法SGD AdaGrad 以及NAG 这三种算法快速 高效 缺点就是极容易收敛到局
  • iOS架构-组件化(项目实战-项目首页架构)

    UI架构设计 设计模式 外观模式 代理模式 适配器模式 adapter 注意 一版本只是搭建结构 一 1 0 Tab搭建 二 1 1 新增UICollectionView 主页 gt 整体设计基于 gt UICollectionView 滑