黑马程序员出品,必属精品。
教程列表:
day01-02-Swift简介
day01-15-用老板的心态工作
day01-17-{}在 OC 中的几个常用写法
day01-05-第一个应用程序的体验
day01-09-变量和常量可选值的默认值
day01-11-[重要]问号操作符号
day01-20-for循环
day01-07-变量和常量
day01-18-switch的语法演练
day01-16-上课课程回顾
day01-12-[重要]if let
day01-19-传统 for 已经被取消
day01-06-Xcode8.0扩展演练
day01-14-[重要]if let & guard let 的命名技巧
day01-13-[重要]guard let的使用
day01-10-简单的分支和三目的写法
day01-08-[重要]可选项的概念
day01-04-playground快速体验
day01-03-修改默认的Xcode
day01-01-课程大纲
day01-29-字典的增删改/遍历/合并
day01-27-数组的合并
day01-26-数组的增/删/改和容量
day01-30-tableView的实战演练
day01-25-数组的遍历
day01-32-课程小结&playgorund的学习技巧
day01-28-字典定义
day01-24-数组的定义
day01-23-字符串的子串
day01-21-字符串遍历和长度的三种方法
day01-22-拼接字符串&格式化字符串
day02-07-函数的无返回值的三种情况
day02-08-[最好记住]闭包的定义格式
day02-03-课程目标
day02-01-回复反馈
day02-06-[重要]函数的默认值
day02-02-按钮状态的枚举值&文档注释
day02-05-外部参数和下划线的忽略
day02-04-[重要]函数定义的格式
day02-29-KVC 构造函数中基本数据类型和私有属性
day02-28-KVC 函数调用的基本实现
day02-30-子类构造函数的继承以及KVC构造函数的小结
day02-27-isa指针介绍
day02-25-重载构造函数
day02-19-加法计算器代码实现
day02-22-必选属性的构造过程
day02-24-必选参数构造函数小结&重写的概念
day02-20-关于执行力
day02-23-子类的必选属性的构造过程
day02-21-关于命名空间
day02-17-[面试有用]OC中解决循环引用的两种方法
day02-14-[重要]使用OC的方式解除循环引用
day02-18-闭包的简单小结
day02-09-GCD Swift中代码变化以及 WWDC 大会视频介绍
day02-13-使用 Swift 实现循环引用
day02-15-[技巧]Xcode 8利用内存图分析循环应用
day02-11-尾随闭包
day02-10-通过闭包回调传递参数
day02-16-[重要]Swift解决循环引用的两种方法
day02-26-重载构造函数的小结
day02-38-界面搭建
day02-36-当前课程小结
day02-32-运行时观察属性的情况&guard语法守护
day02-35-便利构造函数抽取控件创建方法
day02-37-需求分析
day02-43-编辑保存完成的闭包回调
day02-31-用 Swift 运行时获取对象属性列表
day02-33-使用 session 加载百度数据
day02-44-新建个人记录&闭包简单的对比
day02-39-异步加载数据,闭包回调
day02-41-传递数据给明细控制器
day02-40-绑定表格数据&准备明细控制器界面
day03-19-关于简历的一些细节
day03-15-用 反射加载类以及重点
day03-17-抽取 namespace 的计算型属性
day03-20-新浪微博项目简介
day03-04-可选项的小结
day03-16-从 info.plist 加载 命名空间的名称
day03-01-回复反馈
day03-11-计算型属性和懒加载的区别
day03-18-获取UIKit的头文件&新建类要选择CocoaTouch
day03-08-懒加载和OC的区别
day03-02-私人通讯录的循环引用&全局断点
day03-13-反射机制的介绍
day03-12-利用 模型的 didSet 设置 UI 界面
day03-09-getter & setter 方法的演示
day03-05-UIView及子类的构造函数 initWithCoder
day03-03-课程目标介绍
day03-10-只读属性的编写格式,直接 return
day03-14-使用纯代码加载启动控制器
day03-06-懒加载的基本实现
day03-07-懒加载的完整写法
day03-21-开源中国社区的目的
day03-36-抽取 barButtonItem 便利构造函数
day03-34-重写 push 方法,隐藏底部的 tabBar
day03-33-添加测试控制器,push 显示
day03-32-加号按钮宽度计算的方法
day03-31-利用 @objc private 保护函数,同时允许按钮调用
day03-29-通过标题属性字典,设置 tabbar 的按钮的颜色和大小
day03-25-设置项目目录结构
day03-30-设置撰写按钮
day03-26-[重要]添加 CZAdditions,通过桥接文件让 Swift 调用 OC 代码
day03-27-使用字典创建一个子控制器
day03-22-配置 SSHKey 的步骤
day03-23-将项目部署到 oschina 上
day03-24-添加图标和启动图片
day03-28-添加其他子控制器
day03-40-添加导航条返回按钮&设置标题颜色
day03-35-扩展测试控制器,不停的push
day03-37-自定义 navBar & 重写 title 的 didSet
day03-38-设置 item 按钮&条子渲染颜色
day03-39-设置返回按钮
day03-41-课程小结
day04-01-回复反馈&课程目标
day04-16-访客视图需求&通过用户登录标记决定显示的视图
day04-12-模拟延迟下拉刷新数据&dispatch_after回顾
day04-11-添加下拉刷新控件
day04-13-上拉刷新的条件判断
day04-02-系统架构思维导图
day04-14-封装上拉刷新逻辑处理
day04-17-添加访客视图素材&准备访客视图
day04-06-利用 extension 隔离表格数据源方法
day04-09-调整表格内容间距
day04-07-首页绑定假数据
day04-05-添加 tableView
day04-03-设置设备方向支持
day04-04-测试设备横屏
day04-15-如果子类不实现任何方法,默认关闭刷新控件
day04-08-拆分分支恢复代码
day04-10-合并分支并且解决冲突
day04-30-利用信息字典,传递并且设置访客视图的显示
day04-31-设置访客视图的显示细节
day04-26-修改成访客视图字典属性
day04-35-在 AppDelegate 模拟加载网络应用程序配置 json
day04-36-判断是从沙盒还是 bundle 加载 main.json
day04-23-使用 VFL 设置 maskIconView 的布局
day04-34-使用 json 设置界面控制器内容
day04-33-将界面数据输出到 json
day04-37-系统架构阶段性小结
day04-22-访客视图主要控件自动布局
day04-29-确定和验证 json 的数据格式
day04-32-设置首页转轮动画
day04-18-懒加载访客视图控件&extension 和 懒加载类型的细节
day04-27-动态通过网络改变 App 界面的逻辑介绍
day04-25-使用字典设置访客视图的信息
day04-28-修改界面配置数组,和创建子控制器的参数格式
day04-24-使用背景颜色处理剩余部分的显示
day04-19-复习原生自动布局&小房子图像视图布局
day04-20-oschina的发现功能
day04-21-苹果原生自动布局函数的回顾
day04-38-Swift中的错误处理知识点
day04-42-课程小结&预习代码介绍
day04-40-添加未登录的导航按钮,调整子类重写的 setupUI 方法
day04-39-通过 add target 添加访客视图监听&代理和add target的区别
day04-41-设置默认 barbutton 的渲染颜色
day05-20-上拉刷新实现
day05-17-下拉刷新微博数据
day05-15-建立视图模型,封装加载微博数据方法
day05-11-建立 tokenRequest 方法,单独处理 token 字典
day05-09-使用一个函数封装 AFN 的 GET&POST 请求
day05-01-回复反馈和课程目标
day05-19-上午课程小结
day05-12-token过期处理
day05-10-利用 extension 封装新浪微博请求方法
day05-13-网络框架小结
day05-16-绑定微博表格数据
day05-02-第三方登录介绍
day05-08-关于开发者信息的补充
day05-14-建立微博数据模型
day05-07-最简单的token演示&强调课程目标
day05-06-创建网络工具单例
day05-05-使用 cocoapod 导入第三方框架
day05-04-用 URL 拼接 token 字符串访问用户微博数据演示
day05-03-创建应用程序
day05-33-课程小结
day05-21-上拉刷新的上限设置,超出上限不再上拉刷新
day05-28-获取请求码的浏览器演示
day05-25-使用 #available 是检测设备版本,获取用户授权显示badgeNumber
day05-30-通过通知将用户登录需求传递给 Main 控制器
day05-32-按钮的设置 Normal 状态的文字和颜色
day05-26-利用 将要选择 TabBarItem 代理方法解决加号按钮穿帮问题
day05-24-定期检查新微博的数量
day05-29-将 userLogon 标记转移到网络管理器中
day05-23-监测未读的微博数量
day05-31-展现登录控制器,设置导航栏
day05-22-关于变量命名和三目的细节
day05-27-点击 tabBar 滚动到顶部并且加载数据
day06-18-保存用户账户模型
day06-01-回复反馈
day06-07-判断主机头&查询字符串以及 URL 的复习
day06-10-实现 加载 AccessToken 的部分代码
day06-14-使用 userAccount 替换 accessToken
day06-16-token过期日期的处理/开发者和使用者过期的演示
day06-09-增加指示器和取消webview的滚动!
day06-17-数据存储方式的回忆
day06-15-使用 yy_modelSet 用字典设置模型数据
day06-12-Token的数据结构以及测试账号的添加方法
day06-02-课程目标&代码准备
day06-13-建立用户账户模型
day06-08-获取授权码
day06-11-设置AFN反序列化支持的数据类型
day06-06-跟踪登录的 url 内容,确定获取授权码的思路
day06-03-添加应用程序信息
day06-04-加载授权页面
day06-05-自动填充用户名和密码
day06-36-明确界面切换目标&准备素材
day06-32-增加 loadUserInfo 方法,加载用户头像和昵称
day06-30-如果 token 过期,重新发送登录通知
day06-35-利用 layoutSubviews 重新调整按钮文字和图像的位置
day06-37-使用假的计算型属性判断添加的视图
day06-19-关于工作前的心态和一些框架的作用
day06-34-新建标题按钮,抽取标题按钮的创建逻辑
day06-38-关于版本号的科普
day06-25-登录成功的回调
day06-24-token有效期的过期处理
day06-33-添加昵称标题按钮
day06-31-登录成功后需要处理的细节小结
day06-29-设置提示/AFN指示器
day06-27-注册并且监听通知,切换视图内容
day06-21-=确认加载用户文件的代码位置/抽取账户文件名
day06-28-登录成功处理导航栏按钮/设置表格的指示器缩进
day06-20-上午课程回顾&思维导图梳理
day06-22-从磁盘加载 用户账户信息并且设置模型
day06-26-登录成功发送登录成功通知
day06-23-关于用户账户加载,提示练习思路,可以不看
day06-43-在 awakeFromNib 加载图像
day06-47-课程小结
day06-42-欢迎界面自动布局动画实现
day06-46-新特性代码的滚动视图代理方法实现
day06-40-新版本判断的代码逻辑实现
day06-45-在 awakeFromNib 设置新特性的图像
day06-41-使用 xib 加载欢迎视图
day06-44-新特性界面布局&代码连线
day06-39-判断新版本的逻辑伪代码
day07-14-微博 Cell 的连线
day07-12-纯文本微博顶部布局
day07-07-用新的尺寸绘制新图像,解决拉伸问题
day07-16-新建微博用户模型
day07-20-再次字典转视图模型
day07-19-字典转模型
day07-08-绘制圆形图像以及边界,解决图像性能问题
day07-17-实现微博用户的字典转模型
day07-09-JPG格式的图像性能优化
day07-18-添加单条微博视图模型
day07-03-代码评审简介
day07-15-设置微博文字取消分隔线
day07-11-添加 微博 Cell 的 XIB 并且验证
day07-02-微博首页课程重点强调
day07-13-纯文本Cell布局结束
day07-10-微博Cell布局分析
day07-01-回复反馈
day07-06-图像性能优化中的混合颜色和拉伸显示确定
day07-04-修改欢迎和新特性界面的两个细节
day07-05-设置 tabbarItem 以及建立developer 分支
day07-36-根据配图数量计算配图视图大小
day07-34-增加配图模型数组,扩展 YY_Model 的使用
day07-38-配图视图的九宫格布局
day07-40-设置 4 张图像 & 背景颜色
day07-39-循环设置图像
day07-33-取消微博配图视图顶部约束
day07-28-底部工具栏布局
day07-30-设置底部工具栏的数据
day07-24-设置会员图标/表格性能优化简介
day07-22-意之所至,能量随来
day07-32-测试修改配图视图的高度
day07-35-准备配图视图大小属性和计算方法
day07-29-添加底部工具栏视图
day07-37-抽取配图视图所需的常量
day07-26-隔离 SDWebImage 的函数,设置头像
day07-27-设置用户圆形图像
day07-31-添加配图视图的自动布局
day07-21-实现视图模型的 description & 替换 home 中的数据
day07-23-上午课程简单回顾
day07-25-设置认证图标
day08-15-调度组的演练
day07-41-课程小结
day08-10-被转发微博的配图实现
day08-16-使用 SDWebImage 的核心方法下载图像
day08-19-根据单张图像更新配图视图的尺寸
day08-14-确定要缓存的单张图像 URL
day08-11-设置被转发微博的文字
day08-12-获取网络图像的三种方式介绍
day08-07-被转发微博的xib布局
day08-18-通过参数传递闭包,再缓存执行之后,再刷新表格
day08-17-使用调度组监听单张图片缓存结束
day08-09-被转发微博的数据结构介绍
day08-13-做准备函数缓存单张图像
day08-06-复制被转发微博 Cell 的 XIB
day08-01-回复反馈&Xcode 8 beta
day08-02-真对Xcode8 beta2修改语法
day08-04-课程目标确定
day08-03-关于四张图的算法介绍
day08-39-通过 KVO 监听刷新控件的 contentOffset,并且计算刷新控件的高度
day08-33-离屏渲染和栅格化
day08-34-图片过宽或者过窄处理
day08-30-计算行高代码实现
day08-32-缓存行高小结以及性能优化测试
day08-36-系统刷新控件存在的问题
day08-26-设置真机运行& Instrument简单介绍
day08-29-查看XIB确认计算行高需要的条件
day08-24-单图缓存思路小结
day08-38-增加新浪微博的刷新控件代码
day08-27-刷新频率的性能测试演示
day08-31-缓存行高的实现
day08-37-添加自定义刷新控件,替代系统原有的控件(争取做最小的改动)
day08-22-关于领导的心态
day08-35-刷新控件的目标明确和项目准备
day08-25-关于视图模型的小结
day08-21-设置单张图片在配图视图中的显示
day08-28-表格性能优化知识点小结以及缓存行高的重要性
day08-23-被转发微博的思路小结
day08-20-通过视图模型修改配图视图的高度约束!
day09-22-2-自定义刷新控件开发完成
day09-23-自定义刷新控件
day09-16-用户放手,显示刷新状态,调整表格的顶部间距
day09-20-在 endRefreshing 判断状态,防止重复调整表格间距
day08-40-当天知识点小结
day09-09-通过状态处理临界点的问题
day09-19-endRefreshing 部分实现
day09-01-回复反馈
day09-07-通过原生的自动布局,设置刷新视图的位置
day09-06-新建刷新视图/连线并且布局
day09-02-目标明确
day09-04-前一天代码回顾
day09-11-旋转的动画处理
day09-17-实现 beginRefreshing 方法
day09-08-增加临界点判断(未完成)
day09-18-整合开始刷新和 KVO 的方法
day09-05-移除 KVO 监听
day09-10-修改提示文字
day09-03-图像过窄处理的bug修订,和代码建议
day09-37-调整 setupUI 调用的顺序,强行更新布局,设置 scrollView 的大小
day09-34-添加自定义按钮,测试自定义控件
day09-39-第一个视图中的 6 个按钮的布局
day09-42-点击更多按钮功能实现
day09-31-添加撰写微博类型选择视图
day09-33-撰写类型XIB布局/不同设备的预览
day09-30-整合美团外卖的刷新
day09-43-返回按钮功能实现
day09-40-添加 scrollView 内部视图/设置 scrollView 的属性
day09-36-添加类型按钮的思路分析
day09-41-通过 actionName 设置点击更多按钮的监听方法
day09-38-添加 6 个按钮
day09-35-取消按钮的 autoresizing,解决不能交互的问题
day09-32-使用 XIB 加载视图
day09-24-增加小人儿刷新
day09-25-添加美团外卖刷新 XIB,会崩溃
day09-27-房子和地球设置
day09-29-给刷新视图的子视图-美团刷新视图设置父视图高度属性
day09-28-设置袋鼠的定位点
day09-26-增加可选项,调整下拉间距
day09-53-完成回调展现撰写视图控制器/解决循环引用
day10-06-基本的正则表达式代码实现
day10-07-使用正则表达式从字符串中获取URL链接和文本
day10-09-抽取检测 href 链接和文本的方法
day10-05-正则表达式在Xcode中替换字符串
day09-48-隐藏按钮,倒序遍历,调整动画时间
day10-04-导入微博来源属性
day09-47-添加按钮显示,设置动画时间
day09-54-课程小结
day10-03-修改刷新中继续下拉导致袋鼠消失的 bug
day10-02-直接修改结构体的 x,调整标题栏错误的 bug
day10-08-正则表达式的简单介绍
day09-45-pop框架简介
day09-50-添加所有按钮的监听方法,并且用按钮记录要展现控制器的类名
day09-51-放大/缩小选中的按钮
day09-49-隐藏动画,添加动画监听方法
day10-01-回复反馈&课程目标
day09-46-第一个最简单的 pop 动画
day09-44-使用iMovie逐帧分析应用程序动画效果
day09-52-添加渐变动画,监听动画完成
day10-13-用 Swift 实现简单的图文混排
day10-14-表情包框架的简单演示
day10-18-Swift 单例的复习和扩展
day10-22-在 directory 的 didSet 加载表情模型数组
day10-27-尾随闭包的的简写格式
day10-32-设置微博中的微博文字和转发文字的图文混排
day10-26-在所有表情包数组中过滤表情,方法一
day10-19-从自定义 bundle 中加载 plist 并且获取数组
day10-12-OC的图文混排复习
day10-28-建立当前表情的属性文本
day10-25-给表情模型增加目录属性,以及图像的计算型属性,方便后续的图像获取
day10-24-上午课程回顾
day10-23-午间分享-面试的小贴士
day10-21-加载表情包数据数组
day10-20-建立表情包模型和表情模型
day10-16-三种拖拽文件夹的方式
day10-10-利用元组返回结果&使用视图模型设置来源字符串
day10-15-HMEmoticon数据格式介绍
day10-17-表情包数据结构强调
day10-43-在 home 控制器中,设置代理,实现协议方法
day10-40-重写属性,当属性变化时通知 textStorage 变化
day10-44-加载 webView 显示内容
day10-39-和 URL 的文本交互,高亮显示(setNeedsDisplay)
day10-41-使用 FFLabel 设置微博文字和转发文字的自定义类,修改属性文本颜色
day10-37-使用正则表达式,过滤 textStrorage 中的 url 范围数组
day10-34-TextKit类结构介绍
day10-38-使用正则表达式过滤 URL,设置 URL 的特殊显示
day10-31-将属性字符串的生成方法,封装到单例中
day10-29-使用正则表达查找所有的表情文字
day10-30-替换属性文本中的图像文本实现
day10-33-演示没有设置属性字符串字体的错误效果!
day10-35-TextKit的准备工作
day11-17-通过代理监听文本变化,修改发布按钮状态&通知和代理的对比
day11-18-发布文本微博的基本代码实现&405访问错误!
day11-10-添加toolbar中的按钮
day11-19-发布完成,修改指示器样式,提示用户
day11-15-自定义文本视图,添加占位 label
day11-13-利用通知调整 toolbar 底部约束
day11-11-用Xcode 7.3编写通知代码,第四个参数是发送通知的对象
day11-08-使用 XIB 设置标题视图
day11-03-三种拖拽文件夹的方式
day11-16-利用通知监听占位文本的显示和隐藏
day11-02-三种try
day11-05-撰写控制器简单布局
day11-06-使用代码创建发布按钮
day11-20-上午课程回顾
day11-14-键盘的显示和隐藏处理&占位文字的思考
day11-12-利用Xcode转换,查找通知在Swift3.0的写法
day11-09-增加属性文本XIB 的技巧注释
day11-32-使用代码实现图像拉伸,设置按钮的背景图片
day11-33-使用 class 和 nib 注册可重用cell,绑定假数据
day11-40-单个页面 cell 的 21 个按钮的九宫格布局
day11-34-添加布局属性,确定 cell 的解决方案,一个 cell 对应一个完整的页面
day11-38-确认 XIB 加载的 cell 大小,九宫格布局简单准备
day11-36-表情数据模型的回顾
day11-28-表情输入视图的准备工作
day11-30-添加工具栏按钮/以及简单的布局
day11-21-准备 upload 网络上传文件的方法
day11-31-建立表情素材的 bundle 的懒加载属性
day11-25-切换键盘的三句核心代码
day11-24-调整微博发布接口,测试发布带图片的微博
day11-22-创建 formData,复习相关参数
day11-29-表情键盘基本布局,控件连线
day11-26-[重要]键盘的输入视图/助理视图/刷新视图
day11-23-扩展 tokenRequest 网络请求方法
day11-37-确定表情页面的数量
day11-27-网络多线程复习的技巧分享
day11-59-课程回顾
day11-55-遍历属性文本,确定获取完整属性字符串的思路
day11-57-继承表情键盘,处理表情图片输入(调用代理方法和通知方法)
day11-53-插入图片表情
day11-56-自定义附件子类,完成字符串的转换
day11-48-添加表情按钮的监听方法,获得表情模型和nil到删除按钮
day11-54-解决图片文本的字体属性问题
day11-51-循环引用的分析和解决
day11-50-利用闭包回调选中的表情模型
day11-49-通过代理传递选中的表情模型
day11-52-删除按钮和 emoji 字符串
day11-44-emoji字符串的转换
day11-41-使用 indexPath.item 截取表情包中表情数组的子数组
day11-42-在属性的 didSet 中,显示表情图片按钮
day11-47-添加设置删除按钮
day11-45-设置 emoji 完成
day12-19-调整列表视图模型,从数据库加载缓存数据
day12-14-生成查询的 SQL 并且测试默认/上拉/下拉三种刷新的SQL
day12-18-确定加载微博函数的参数和完成回调,实现伪代码
day12-16-调整目录结构,导入封装完成的 SQLite 管理器
day12-12-实现查询方法,返回结果字典数组
day12-20-在数据库管理工具监听应用程序进入后台事件,通知一对多
day12-06-创建数据表,串行队列,同步执行
day12-10-批量插入微博数据
day12-15-执行 SQL,反序列化数据库保存的 json 数据
day12-17-新增数据访问层,确定数据缓存思路
day12-08-准备新增或者修改微博函数,确定函数的参数
day12-13-确定从数据库加载微博数据数组的函数的参数和返回值
day12-03-添加 fmdb 框架,建立 数据库管理单例
day12-07-测试插入数据的SQL,INSERT OR REPLACE
day12-05-微博数据结构确定(社交类需要考虑小号)
day12-02-课程目标
day12-04-创建数据库队列,创建或者打开数据库
day12-35-手势剩余状态的处理,长按手势/锚点
day12-36-添加最近使用的表情的基本代码实现
day12-40-设置 toolbar 选中分组按钮状态
day12-30-根据触摸位置,查找对应的按钮
day12-37-第0个分组不排序,数组排序的闭包简写
day12-39-定义工具栏选中按钮代理方法,遵守协议,实现方法
day12-34-利用 pop 设置表情按钮的动画
day12-28-新建提示视图,测试向当前视图添加提示视图
day12-33-设置提示视图中的按钮表情,如果表情一致,直接返回
day12-31-通过锚点,设置提示图片的位置
day12-32-通过定位点设置提示按钮的显示位置
day12-23-定义分类方法,计算指定时间差的日期字符串
day12-29-将提示视图添加到窗口上
day12-27-添加 表情 cell 的长按手势识别
day12-25-能够做数据缓存的数据类型和特点
day12-21-调整创表 SQL, 增加微博记录创建时间
day12-24-清理数据缓存 实现
day12-26-关于工作列表和日常工作管理清单
day12-22-上午课程回顾
day12-55-pod 前期准备以及一些分享
day12-43-设置分页控件的显示
day12-54-实现日期描述字符串
day12-49-处理照片浏览需要的参数
day12-50-整合图片浏览器功能
day12-48-添加图像的手势识别
day12-56-测试pod发布
day12-44-用运行时查看分页控件的成员列表,使用 KVC 设置分页控件的图像
day12-53-将新浪微博格式的字符串转换成日期
day12-52-根据扩展名判断是否是 gif 提示图片
day12-42-实现滚动视图的代理方法,根据中心点位置判断底部分组按钮的选中状态
day12-51-添加 gif 提示图像,设置自动布局
day12-46-关于图片清晰度的处理,替换 wap360
day12-47-导入照片浏览框架,框架接口介绍
day12-45-让导航控制器强行更新约束