在viewDidAppear中PushViewController失败的问题

需要在 ViewController(FirstViewController)的 viewDidAppear 中 Push 另一个 ViewController()SecondViewController),于是使用如下代码: - (void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; UIViewController *secondViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"secondViewController"]; [self.navigationController pushViewController:secondViewController animated:YES]; } 在 iOS8 中,这段代码工作良好,当 FirstViewController 出现时,由于立刻 Push 了 SecondViewController,即使 animated 参数是 YES,Push 的动画都没有显示出来。但是在 iOS7 中却出现了不一样的情况,pushViewController 方法似乎没有执行,SecondViewController 也没有被推出。打断点可以发现 pushViewController 方法是被执行了的,但是界面上没有任何效果。 由于 pushViewController 方法是在 viewDidAppear 中被调用的,会不会是因为 viewDidAppear 时 FirstViewController 还有什么 UI 上的动作没有处理完,导致立即调用 pushViewController 失败?那么将 pushViewController 放入 dispatch_async 中应该就能解决这个问题。使用如下代码实现: - (void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; UIViewController *secondViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"secondViewController"]; dispatch_async(dispatch_get_main_queue(), ^{ [self.navigationController pushViewController:secondViewController animated:YES]; }); } ...

三月 13, 2015 · 1 分钟 · Zhiya

使用TestFlight进行应用的Beta测试

TestFlight 已经被 Apple 集成到 iTunes Connect 中,现在使用 TestFlight 可以很方便的进行应用的 Beta 测试。下面就来介绍一下如何使用 TestFlight 进行测试,已经其中的一些小问题。 首先需要在 iTunes Connect 中启用 TestFlight,可以针对每个 App 的某一版本,决定是否启用 TestFlight。进入 iTunes Connect -> My Apps -> 某个 App -> Prerelease,在上传的 Build 右上角,打开 TestFlight 的开关,接下来就针对这个版本启动了 TestFlight。 有了可以测试的应用,接下来还要有测试用户,TestFlight 测试用户有两种,一种是内测用户 InternalTester,最多 25 个,一种是公测用户 ExternalTester,最多 1000 个,内测用户需要首先成为 iTunes Connect User,而公测用户只需要知道他的 Apple Id 就可。要进行公测需要先经过 Apple Review 团队的审核。我们以添加一个内测用户为例,进入 iTunes Connect -> Users and Roles -> iTunes Connect Users,首先添加一个 iTunes Connect User,之所以要添加 iTunes Connect User,是因为 TestFlight 的测试用户必须是一个 iTunes Connect User,并且这个用户的角色必须是 Admin 或者 Technical。添加后,用户的邮箱里会收到一封邀请邮件,点击邮件中的链接可以激活成为 iTunes Connect User。进入 iTunes Connect -> Users and Roles -> TestFlight Beta Testers,激活的 iTunes Connect User 会出现在这里,选中点击右上角的保存,这个用户就成为一个内测用户了。 ...

十月 30, 2014 · 1 分钟 · Zhiya

iOS8中LaunchImage和LaunchScreen的完美结合

Apple 在 iOS8 中推出了 LaunchScreen.xib 来代替之前的 LaunchImage 作为程序的启动界面,相比与 LaunchImage,在 iOS 设备屏幕尺寸越来越多样的情况下,LaunchScreen.xib 依托 AutoLayout 无疑更方便,否则,对于一个兼容 iPhone5-iPhone6Plus 的应用,就需要有 4 长不同尺寸的 LaunchImage。 但是 LaunchScreen 只有在 iOS8 中才能被支持,所以一些开发者还是选择用传统的 LaunchImage 方式。不过,还有一种方式是将 LaunchImage 和 LaunchScreen 结合,在大尺寸 iPhone 中使用 LaunchScreen(iPhone6 和 iPhone6Plus 都是 iOS8 系统),在 iOS7 中使用 LaunchImage(使用 iOS7 的手机只有 4 寸和 5.5 寸的 iPhone,所以只需要两张图)。 首先进入 Target 配置,找到 App Icons and Launch Images,Xcode6 中默认使用了 LaunchScreen.xib,而 LaunchImage 则没有使用。 接下来点击 Use Assets Catelog,这时 Xcode 会在 Images.xcassets 中生成 LaunchImage,这里我们只需要给 4 寸 Retina 屏和 3.5 寸 2x 屏放两张 LaunchImage 就好了。 ...

十月 25, 2014 · 1 分钟 · Zhiya

iOS8注册推送失败的探究

Apple 在 9 月 18 日正式发布了 iOS8,在收到更新的同时,也发现自己的应用在 iOS8 下无法启动。 并且在 Console 中收到如下提示: 2014-09-19 16:26:20.369 demo[379:30506] registerForRemoteNotificationTypes: is not supported in iOS 8.0 and later. 查询文档可以知道,在 iOS8 中注册推送的方法registerForRemoteNotificationTypes已经被废弃,文档中是这样描述的: 按照文档中的提示,使用registerForRemoteNotifications方法代替,这个方法不接受参数。紧接着问题就来了,程序在安装过这个应用的 iOS8 机器上可以成功注册,而在新安装的 iOS8 机器上则无法注册,application:didRegisterForRemoteNotificationsWithDeviceToken:和application:didFailToRegisterForRemoteNotificationsWithError:都无法响应,并且在成功注册的机器上,收到的推送消息也没有声音提示。再次查看文档后发现这么一段话: If you want your app’s push notifications to display alerts, play sounds, or perform other user-facing actions, you must call the registerUserNotificationSettings: method to request the types of notifications you want to use. 换句话说,如果要使用推送服务,还需要再调用registerUserNotificationSettings方法,而这个方法是和 iOS7 上的registerForRemoteNotificationTypes方法一样接受参数的。为什么 iOS8 下要把一个方法变成两个方法呢?registerForRemoteNotifications方法的文档中有这么一句话: ...

九月 19, 2014 · 1 分钟 · Zhiya

iOS6屏幕旋转问题

使用 iOS6 SDK 创建 xib 文件时,会默认启用 AutoLayout 功能,AutoLayout 是 iOS6 中新推出的自动布局功能,通过相对定位来实现适应多种屏幕分辩率的自动布局(iOS 设备分辨率会朝着多样化的方向发展?)。 当使用 AutoLayout 的项目在 iOS6 以下的系统中运行时,程序执行会报错,于是,关闭所有 xib 的 AutoLayout 选项,再次运行,发现原本设置为横屏显示的项目变成了竖屏,所有横屏设置失效。 解决办法是,在需要横屏的 Controller 中添加如下代码,最好在将 self.window 设定成一个 RootViewController,然后在 RootViewController 中添加如下代码: // ios5下的旋屏 - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { return UIInterfaceOrientationIsLandscape(interfaceOrientation); } // ios6下的旋屏 -(BOOL)shouldAutorotate { return YES; }

五月 21, 2013 · 1 分钟 · Zhiya