UICollectionView

注册cell 的时候,是 XX 类型和 YY identifier。 一个 XX 可以对应多个 YY。 collectionView.register(MyFirstCell.self, forCellWithReuseIdentifier: "FirstCell") collectionView.register(MySecondCell.self, forCellWithReuseIdentifier: "SecondCell") 应用场景:同一个 UICollectionView 可以有多种 cell,例如有一个额外的带有 ➕ 的 cell,用于向 UICollectionView 添加新的元素。

January 10, 2025

ViewController 生命周期

1. 实例化阶段:init(coder:) 或 init(nibName:bundle:) 被调用 2. 加载视图阶段:loadView → viewDidLoad 3. 视图即将显示:viewWillAppear → viewWillLayoutSubviews 4. 视图完成布局:viewDidLayoutSubviews → viewDidAppear 5. 视图显示期间:viewWillLayoutSubviews/viewDidLayoutSubviews(根据需要多次调用) 6. 视图即将消失:viewWillDisappear 7. 视图已经消失:viewDidDisappear 8. 内存警告:didReceiveMemoryWarning(可能在任何时候发生) 9. 销毁阶段:deinit class LifecycleViewController: UIViewController { // 1. 初始化 override init(nibName: String?, bundle: Bundle?) { super.init(nibName: nibName, bundle: bundle) print("1. 初始化完成") } required init?(coder: NSCoder) { super.init(coder: coder) } // 2. 加载视图 override func loadView() { super.loadView() print("2. loadView 被调用") } // 3. 视图加载完成 override func viewDidLoad() { super.viewDidLoad() print("3. viewDidLoad 被调用") } // 4-5. 视图显示过程 override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) print("4. viewWillAppear 被调用") } override func viewWillLayoutSubviews() { super.viewWillLayoutSubviews() print("5. viewWillLayoutSubviews 被调用") } override func viewDidLayoutSubviews() { super.viewDidLayoutSubviews() print("6. viewDidLayoutSubviews 被调用") } override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) print("7. viewDidAppear 被调用") } // 6-7. 视图消失过程 override func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(animated) print("8. viewWillDisappear 被调用") } override func viewDidDisappear(_ animated: Bool) { super.viewDidDisappear(animated) print("9. viewDidDisappear 被调用") } // 8. 内存警告 override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() print("收到内存警告") } // 9. 析构 deinit { print("10. 视图控制器被销毁") } }

December 29, 2024

App 生命周期

未运行(Not Running):应用尚未启动或被系统终止 非活动(Inactive):应用在前台运行但不接收事件,如来电或推送通知时 活动(Active):应用在前台正常运行并可以接收事件 后台(Background):应用在后台运行,可执行有限的任务 挂起(Suspended):应用在后台但不执行代码,可能随时被系统终止 App 启动 (App Starts) • 入口方法: application:didFinishLaunchingWithOptions • 该方法是应用启动时的入口点。 • 通常用来初始化应用程序,例如加载配置文件、设置窗口、配置依赖项等。 • 根据是否有传入的 URL 参数,流程会有所不同: • 有 URL: 转入 application:openURL:sourceApplication:annotation: 处理 URL。 • 无 URL: 继续进入活跃状态。 应用进入前台 (Foreground Run Event Loop) • 入口方法: applicationDidBecomeActive • 应用进入前台并开始响应事件。 • 此时,用户可以与应用正常交互,例如触摸、滑动等。 中断事件 (Interruptions) • 例如接听电话、跳转其他应用。 • 入口方法: applicationWillResignActive • 应用即将进入非活动状态(暂停交互)。 • 适合在这里保存数据或暂停需要持续运行的任务。 进入后台 (Background Run Loop) • 入口方法: applicationDidEnterBackground • 应用进入后台,此时需要确保应用资源的正确管理: • 保存用户数据。 • 如果需要继续后台运行,需设置 info.plist 或开启后台任务。 • 如果应用无法在后台继续运行,则可能被系统暂停或终止。 ...

December 29, 2024

“小速记” App 介绍

《小速记》各部分功能介绍 主页面,各个功能入口 ToDo 功能 新建 Todo 时,可设定 Todo 的表情 emoji 、时间段。 右滑删除,左滑完成 Todo,长按 Todo 可设定一个在几分钟后的系统通知推送(提醒这个 Todo) 每日打卡 可以新建任务,设定为每日打卡、每周打卡或每月打卡。 打卡任务有进度,任务完成后会将任务归档。 数字记录器 可以为某一件事情添加计数器,用于腐竹记忆生活中的琐碎数字。 数据 Todo、每日打卡、数字记录器是都作为任务,使用 CoreData 存放于本地。 对应的,有 ArchivedTodo、ArchivedDailyTask、ArchivedRecord 作为归档对象,在任务完成后作为记录存放于本地。 演示 App 使用视频演示

July 7, 2023

如何通过点击 UICollectionViewCell 跳转至对应的 UIViewController

跳转部分的实现 我需要从我的 HomeViewController 通过点击不同的 CollectionViewCell 跳至不同的 ViewController 思路: 首先是需要把目标 ViewController 存放起来,在点击 cell 时可以作为目的地进行 present 跳转。 因为我的多个不同的 ViewController 都继承自 UIViewController, 那么我想用它作为父类型存放在cell中。 先把 Main storyboard 存为当前类的属性,以方便初始化各个 collectionView 然后使用 storyboard 自带的动态反射方法 instantiateViewController,通过字符串找到对应的 ViewController 在 dataSource 的实现中,将 cell 的属性绑定为对应的 controllerView 目标。 最后是 didTapCell 方法,是点击后的具体要做的动作,即跳转。这里的 target 类型是 UIController。 发现这样实现不了,原因是第 1 步中 MainChoiceCell 中的 targetController 不能是 weak,若为 weak 那么它在被赋值然后在函数结束时(closure 结束)会释放引用也就是恢复为 nil,所以正确的做法应该是把 weak 去掉。 手指触碰 UICollectionViewCell 但未释放,这属于 Highlight UICollectionViewCell 底层来自 UIView。重写 highlight 的 willSet, 手指点在 UICollectionViewCell 区域会触发 highlight 置为 true ;手指不松开,移动到不属于 UICollectionViewCell 的区域,则会触发 highlight 置为 false。 ...

May 17, 2023