iPhone软件开发之UINavigationController 装载/卸载 ViewController 的注意事项

本文探讨了在iOS应用中使用多线程处理文件上传时遇到的UI动画问题。具体表现为在网络不佳或无数据情况下,快速执行界面推入与弹出动画导致的导航栏显示异常。文章给出了通过禁用特定动画来解决该问题的方法。

前一篇中说了用多线程搞定进度显示,后面问题就来了。

 

我这个 上传方式是,先显示 ProgressViewController 之后遍历数据结构,找到需要传的,然后进行上传

 

结束后,将  ProgressViewController 弹出,这样 有数据的时候,网络连接正常的情况下,没有问题,

 

但是,在没有网络的情况下,或者是没哟数据的情况下,那么

 

就会出现在很短的时间内进行 pushViewController, popViewController 的操作。

 

同时 这两个方法都指定了使用动画效果。

 

结果就乱掉了。 出现 明明push 结果导航栏没有任何显示,但是进度还存在在街面上,这下完了。

 

之后看了一下 官方文档,其中有说明

 

 

- (void)pushViewController:(UIViewController *)viewController animated:(BOOL)animated

Parameters
viewController

The view controller that is pushed onto the stack. This object cannot be an instance of tab bar controller and it must not already be on the navigation stack.

animated

Specify YES to animate the transition or NO if you do not want the transition to be animated. You might specify NO if you are setting up the navigation controller at launch time.

 

 

那么这个 animated 当为NO 的时候,证明需要设置导航栏的,或者是快速的 push pop 实际上也是设置导航

 

栏。

 

如果 将 push 处 的 animated 修改为 NO 问题就解决了,不过用户体验不好。

 

by vhly[FR]

date: 2009/07/17 21:30

 

HavE a GooD day.

& nbsp;

 

 

 

 

这段代码定义了一个 **自定义导航控制器(`TPContainerNavigationController`)**,并引入了一个协议(`TPControllerOrientationKeepable`)用于控制屏幕方向。以下是详细分析: --- ### 1. **协议 `TPControllerOrientationKeepable`** - **作用**: - 声明一个方法 `controllersNeedToKeepOrientationWhenNavigating`,返回需要保持特定屏幕方向的视图控制器数组。 - 用于在导航跳转时,强制某些页面保持横屏或竖屏(如视频播放页)。 - **典型实现**: ```objectivec @interface MyViewController : UIViewController <TPControllerOrientationKeepable> @end @implementation MyViewController - (NSArray *)controllersNeedToKeepOrientationWhenNavigating { return @[self]; // 当前控制器需要保持方向 } @end ``` --- ### 2. **类 `TPContainerNavigationController`** - **继承关系**: - 继承自 `UINavigationController`,扩展了导航控制器的功能。 - **关键属性**: - `containerViewContorller`:弱引用一个视图控制器,可能是用于包装导航控制器的父容器(如侧边栏或标签栏)。 - **工厂方法**: - `+wrapNavigationControllerWithViewController:`:快速创建导航控制器并包装指定的视图控制器。 ```objectivec + (instancetype)wrapNavigationControllerWithViewController:(UIViewController *)viewController { TPContainerNavigationController *nav = [[TPContainerNavigationController alloc] initWithRootViewController:viewController]; nav.containerViewContorller = viewController; // 可能需要调整逻辑 return nav; } ``` --- ### 3. **代码位置** - **属于项目的基础框架部分**,通常用于: - 统一管理导航栏样式或行为(如全局返回手势、方向控制)。 - 解决特定业务需求(如保持某些页面方向)。 --- ### 4. **潜在问题与改进** - **问题**: 1. **拼写错误**:`containerViewContorller` 应为 `containerViewController`。 2. **工厂方法逻辑**:直接将传入的 `viewController` 赋值给 `containerViewContorller` 可能不符合预期(通常父容器是外部传入的)。 3. **协议方法设计**:返回 `NSArray` 而非 `NSArray<UIViewController *>`,缺乏类型安全。 - **改进建议**: ```objectivec @protocol TPControllerOrientationKeepable <NSObject> - (NSArray<UIViewController *> *)controllersNeedToKeepOrientationWhenNavigating; @end @interface TPContainerNavigationController : UINavigationController @property (nonatomic, weak) UIViewController *containerViewController; + (instancetype)wrapViewController:(UIViewController *)viewController withContainerController:(UIViewController *)containerController; @end @implementation TPContainerNavigationController + (instancetype)wrapViewController:(UIViewController *)viewController withContainerController:(UIViewController *)containerController { TPContainerNavigationController *nav = [[self alloc] initWithRootViewController:viewController]; nav.containerViewController = containerController; return nav; } @end ``` --- ### 5. **使用场景** - **强制横屏**:在视频播放或游戏页面保持横屏,即使导航到其他页面。 - **模块化设计**:将导航控制器嵌入到更复杂的容器中(如抽屉菜单)。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值