天道酬勤,学无止境

iOS7 和 iOS8 跟随.destinationViewController(iOS7 and iOS8 segue.destinationViewController)

问题

我正在尝试让我的应用程序同时适用于 iOS7 和 iOS8,但我在视图控制器中的 prepareForSegue 方法中遇到了问题。

在 iOS8 segue.destinationViewController是 UINavigationController 类,所以我使用[[segue.desinationViewController viewControllers] objectAtIndex:0]工作正常,但在 iOS7 segue.desinationViewController是类 CMAMyViewControllerClassName,当我尝试发送时显然会抛出错误一个viewContollers消息给它。

我找到了这个可行的解决方案,但我想知道是否有更好的解决方案? 除了后一篇文章,我还没有找到任何关于它的信息。 如果没有“正确”的解决方案,我将创建一个获取正确视图控制器的方法; 我只是想知道其他人是如何处理这种情况的。

谢谢!

回答1

通过在尝试访问其属性之一之前检查目标视图控制器的类来解决此问题:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    DestController *vc = segue.destinationViewController;

    if ([dvc isKindOfClass:[DestController class]])
        dvc.propertyName = @"Property Value";
    else
        // do something else
}

取自此线程中的解决方案。

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • iOS7 and iOS8 segue.destinationViewController
    I'm trying to make my app work with both iOS7 and iOS8 and I ran into a problem in my prepareForSegue methods in my view controllers. In iOS8 segue.destinationViewController is of class UINavigationController, so I use [[segue.desinationViewController viewControllers] objectAtIndex:0] which works fine, but in iOS7 segue.desinationViewController is of class CMAMyViewControllerClassName, which will obviously throw an error when I try to send a viewContollers message to it. I found this solution which will work, but I was wondering if there's a better solution? Other than the latter post I haven
  • 在UIViewController上显示clearColor UIViewController(Display clearColor UIViewController over UIViewController)
    问题 我在另一个UIViewController视图的顶部有一个UIViewController视图作为子视图/模式,例如,该子视图/模式应该是透明的,添加到该子视图的任何组件都应该是可见的。 问题是我所拥有的是子视图显示黑色背景,而不是具有clearColor。 我试图使UIView作为clearColor而不是黑色背景。 有人知道这是怎么回事吗? 任何建议表示赞赏。 FirstViewController.m UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil]; UIViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"SecondViewController"]; [vc setModalPresentationStyle:UIModalPresentationFullScreen]; [self presentModalViewController:vc animated:NO]; SecondViewController.m - (void)viewDidLoad { [super viewDidLoad]; self.view.opaque =
  • iOS7和iOS8:如何检测用户何时拒绝推送通知请求(iOS7 and iOS8: how to detect when user said No to a request for push notifications)
    问题 我正在构建针对iOS7和iOS8的应用程序。 我要求用户允许发送推送通知。 但是由于某些原因,如果我在请求推送许可时单击“否”,则iOS7和iOS8都不会调用我的application:didFailToRegisterForRemoteNotificationsWithError处理程序。 我的问题是:如何知道在iOS7和iOS8上用户何时拒绝了推送通知请求?如何知道他们是否拒绝了该请求? 我看了一堆StackOverflow的答案,并实现了他们的建议,但是它没有按文档记录的那样工作: iOS7:如果用户批准了该请求,则系统会调用我的application:didRegisterForRemoteNotificationsWithDeviceToken:处理程序。 所以我可以说他们批准了它。 但是,如果用户拒绝该请求,则不会收到对application:didFailToRegisterForRemoteNotificationsWithError的回调。 这似乎是一个错误,我不能说用户拒绝了该请求。 iOS8:如果用户批准或拒绝该请求,则系统会调用我的application:didRegisterUserNotificationSettings处理程序。 我可以查看notificationSettings参数来查看用户是否批准或拒绝了我的请求,因此非常方便。 但是
  • iOS8的自动布局问题,其代码在iOS7上可以正常运行(Autolayout problems with iOS8 with code that works fine on iOS7)
    问题 我正在为iPhone和iPad开发应用程序。 它支持iOS6和iOS7,并且专门使用自动布局。 过去一周,当苹果公司宣布iOS8已准备就绪,我将其中一部iPhone和iPad都升级到了iOS8。 我还将XCODE升级到了版本6。我有第二台iPhone,我留在iOS7上。 我用Xcode 6生成了新的可执行文件,我很沮丧地看到,在运行iOS8的设备上执行时,它们的屏幕布局被弄乱了,但在iOS7上仍然很好。 在我的物理设备和Xcode的仿真器上都是如此。 进行了大量的挖掘工作,但是我现在很清楚发生了什么,尽管我不知道为什么。 具体来说,某些自动布局操作对我来说在iOS8上失败了,但在iOS7上很好。 一些示例,其中包含一个按钮,我将其放置在大小等于屏幕大小的基础视图上: (1)如果我要求自动布局将按钮的水平中心(CX)定位为与基础视图的水平中心相等,则结果是按钮的水平中心位于基础视图的左边缘。 (2)如果我要求自动布局使按钮的宽度等于基础视图宽度的50%,则根本没有宽度。 我能够解决这些问题,如下所示: (1)我要求自动布局将按钮的中心定位为等于基础视图的左边缘加上屏幕宽度的50%。 (2)我要求自动布局使按钮的宽度等于屏幕宽度的50%。 我通过类似的变通方法慢慢回到自己的方式,回到适用于iOS7和iOS8的自动布局代码。 但是我真的很想知道这是怎么回事。
  • 展示在iOS7和iOS8中都可以使用的半透明ViewController(Presenting semi-transparent viewcontroller that works both in iOS7 and iOS8)
    问题 我有以下代码在iOS7中能正常工作。 [UIView animateWithDuration:0.5 animations:^(void) { self.view.alpha = 0.5; [self.navigationController.navigationBar setAlpha:0.3]; }]; //to make the background view controller semi-transparent UIViewController *rootViewController = [UIApplication sharedApplication].delegate.window.rootViewController; [rootViewController setModalPresentationStyle:UIModalPresentationCurrentContext]; OverlayViewController *ctlr = [storyBoard instantiateViewControllerWithIdentifier:@"OverlayViewController"]; //present the OverlayViewController [self presentViewController:ctlr animated:YES
  • iOS8 中 CGAffineTransform 的动画看起来与 iOS7 不同(Animation of CGAffineTransform in iOS8 looks different than in iOS7)
    问题 我试图找到一个原因,为什么UIView转换属性的动画在 iOS 8 和 iOS 6/7 中看起来不同。 举个简单的例子,在 iOS 8 之前: myView.transform = CGAffineTransformRotate(CGAffineTransformIdentity, 1.57); [UIView animateWithDuration:5 animations:^{ myView.transform = CGAffineTransformTranslate(plane.transform, 100, 0); }]; 给出了预期的结果,“myView”旋转了 90 度并向下移动,但是在 iOS8 中,当翻译动画时,它从我找不到解释的点开始(这打破了动画)。 有谁知道它的解释? 提前致谢! 回答1 CGAffineTransformIdentity 在 ios7 和 ios8 上的表现不同。 这与自动布局和大小类有关。 解决办法是去掉ios7上与动画冲突的约束。 // solve the constraint-animation problem if(NSFoundationVersionNumber <= NSFoundationVersionNumber_iOS_7_1) { // iOS7 remove constraints that conflict
  • iOS7 到 iOS8 应用程序文件迁移(iOS7 to iOS8 application files migration)
    问题 我目前正在 iOS8 上测试我的应用程序。 一切都在纯 iOS8 上运行良好,但我正在努力解决从 iOS7 迁移 App 文件的问题,当 iOS8 公开发布时,用户会遇到这种情况。 由于我的应用程序使用多个“标准目录”(文档、应用程序支持等),我想确保迁移将顺利进行。 iOS8 上的应用程序文件系统结构已更改(阅读 iOS beta 4 发行说明和文件系统编程指南)。 当 iOS8 安装在设备上时,我猜所有以前安装的应用程序和所有相关文件(在文档、应用程序支持等中)将重新组织以匹配新结构。 你们对 iOS7 到 iOS8 升级期间将发生的(详尽的)更改列表有任何线索吗? 我找不到有关此主题的任何文档。 有没有办法测试/模拟将 iOS7 应用程序沙箱迁移到新的 iOS8 沙箱结构? 谢谢 奖励问题:操作系统升级时应用程序 GUID 会发生变化吗? 回答1 应用程序容器的文件系统布局在磁盘上发生了变化。 而不是依赖于硬编码的目录结构中,使用NSSearchPathForDirectoriesInDomains函数或URLForDirectory:inDomain:appropriateForURL:create:error:所述的方法NSFileManager类。 使用URLForDirectory:inDomain:appropriateForURL:create:error
  • 设计同时支持 iOS8 和 iOS7 的应用(Design app that supports both iOS8 and iOS7)
    问题 假设我想设计一个主从应用程序,通用应用程序的 Xcode6 主从项目模板包括 UISplitViewController 和 splitViewController 是 iOS8 中新增的。 我也想支持 iOS7 的应用程序。 一般来说 使用支持 iOS8 和 iOS7 的 Xcode6 故事板设计通用应用程序的最佳方法是什么? 为不同的操作系统版本使用单独的故事板会更好吗? 我们应该遵循哪些最佳实践来使应用程序与两个操作系统兼容? 回答1 创建此类应用程序的“最佳方式”可能取决于您的应用程序究竟需要做什么。 根据需要的任何特殊行为,某些方法会比其他方法更好。 但是绝对可以在 Xcode 6 中使用单个通用故事板,该故事板使用大小类,并且仍然针对 iOS 7,iPhone 和 iPad,使用UISplitViewController 。 我已经成功地做到了这一点。 确实需要做很多工作才能确保它在 iOS 7 和 8 上正常工作并且看起来一致。在执行各种新的自适应转场时你必须小心一点,因为这是 iOS 7 和 8 之间的巨大差异. 例如,检测何时有一个弹出框需要为两个不同的操作系统做一些工作,处理 unwind segues 将需要一些特殊的处理,等等,这将需要大量的测试。 花点时间测试 iPhone 6 Plus - 在横向上,它会在屏幕上显示主图和细节,但您可以控制它。
  • 显示 iOS7、iOS8 的警报(Showing alert with iOS7, iOS8 both)
    问题 由于UIAlertController用于在 iOS8 中显示警报。我的应用程序也应该与 ios6、ios7 兼容。我认为 ios6,7 仍然使用UIAlertView来显示警报。 我想通过不同的方式检查 ios6,7,8 后显示警报,例如使用UIAlertView的 ios7 和使用UIAlertController 。我需要 objectiv-c 代码。 请帮忙!! 提前致谢!! 回答1 检查类是否可用 if ([UIAlertController class]){ // ios 8 or higher UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"Alert title" message:@"Alert message" preferredStyle:UIAlertControllerStyleAlert]; UIAlertAction* ok = [UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:nil]; [alertController addAction:ok]; [self presentViewController
  • iOS7 到 IOS8 中当前位置纬度和经度的不同行为(different behaviour for current location latitude and longitude in iOS7 to IOS8)
    问题 将 xamarin 用于当前位置 currentLocation 示例我使用上面的链接来获取当前位置的纬度和经度。 在升级到 IOS 8 之前的 IOS 7 中,它在模拟器和设备上显示了我当前的位置纬度和经度。(在模拟器中获取当前位置纬度和经度对我来说看起来很奇怪)。 升级到 iOS 8 并运行相同的代码后,它给出 在模拟器中:(始终打开 wifi 无 sim 卡定位服务应用程序。) Result: latitude = 37.785834. longitude = -122.406517. 在设备 IPhone5c 上(始终打开 wifi 无 sim 卡定位服务应用程序。) Result: latitude = 37.785834. longitude = -122.406517. (但我预计我当前的位置纬度和经度) 升级后它不会询问,该应用程序喜欢使用您当前的位置 GPS。 带有 YES、NO 选项的警报消息。 如何获取我当前位置的经纬度? 回答1 从 iOS 8.0 开始,您需要明确请求许可。 这样做的步骤: 更新您的 Info.plist 文件。 插入一个新键: NSLocationAlwaysUsageDescription或NSLocationWhenInUseUsageDescription键并编写自定义消息,当您的应用请求权限时将显示该消息。 必须在
  • PhoneGap在iOS8中使用的内存要比iOS7多(PhoneGap using way more memory in iOS8 than iOS7)
    问题 我有一个PhoneGap应用程序。 HTML5 Canvas游戏。 与iOS 7相比,它似乎在iOS 8(包括8.0.2)中使用了更多的内存。 除了使用更多的内存外,JS垃圾回收器似乎从未释放过它所持有的内存。 它可以正确收集“已释放”的内存,但是永远不会将其释放给iOS使用。 以下是在iOS 7下使用iPhone 5S使用仪器分配的内存使用情况。 如您所见,它在我加载和卸载关卡时会上下波动。 此外,内存使用率非常低,大约为23mb,最大为41.81mb 这是在装有iOS 8.0.2的iPhone 5S上运行的同一应用程序。 如您所见,内存使用率从未下降,并且使用了更多的内存。 实际上,当我加载和卸载相同级别的内存时,内存使用量会一直持续增长。 它没有上升那么高,这使我认为JS可以正确地重新使用垃圾回收器中的内存,但是GC似乎从未释放它保留给操作系统的内存。 同样,整个应用似乎正在使用比以前更多的内存。 该应用程序的运行速度也慢得多,到我停止运行时达到了121mb。 我应该补充一点,在卸载关卡时,我会重新加载页面,奇怪的是,这并没有释放iOS 8下的任何内存。 有谁知道什么可能导致此问题以及解决方案是什么? 这是iOS 8中的错误吗? 在8.0(但不是8.1)中,可以使用变通方法/黑客来释放:调用window.location.reload(true); 在使用window
  • 在UIWebview中添加了空格-在iOS7和iOS8中删除了UIWebView空格(Added whitespace in UIWebview - removing UIWebView whitespace in iOS7 & iOS8)
    问题 我正在加载本地html文件,因为iOS7在UIWebView的顶部添加了空白(我无法发布图像,因为我没有足够的点数。)图像可以在此处看到-从iPhone模拟器拍摄的uiwebview被黑色包围框架,html内容为灰色,但其上方添加了白色 我试图使用调整变焦 [webView stringByEvaluatingJavaScriptFromString:@"document. body.style.zoom = 5.0;"]; webView.scalesPageToFit = NO; 归功于:Srikar Appal 我还设置了尝试消除白色间距的方法: NSString *padding = @"document.body.style.margin='0';document.body.style.padding = '0'"; [webView stringByEvaluatingJavaScriptFromString:padding]; 归功于:theextmillionaire 仍然没有运气。 在桌面chrome浏览器中没有空格。 html文件是Google Swiffy文件-包含html和JSON。 编辑:更新图像 回答1 尝试self.automaticallyAdjustsScrollViewInsets = NO; 在ViewDidLoad中。 ios
  • iOS7 and iOS8: how to detect when user said No to a request for push notifications
    I am building an app that targets iOS7 and iOS8. I ask the user for permission to send push notifications. But for some reason, neither iOS7 nor iOS8 ever calls my application:didFailToRegisterForRemoteNotificationsWithError handler if I click "No" when asked for push permission. My question: how do I know, on both iOS7 and iOS8, when the user has dismissed the request for push notifications--and how do I know if they denied the request? I've looked at a bunch of StackOverflow answers and have implemented what they suggest, but it's not working as documented: iOS7: if the user approves the
  • iOS7 to iOS8 application files migration
    I am currently testing my app on iOS8. Everything works well on pure iOS8 but I am struggling with the App files migration from iOS7 that will occur for users when iOS8 will be publicly released. As my application uses several "Standard Directories" (Documents, Application Support, ...), I would like to be sure the migration will be smooth. The application filesystem structure has changed on iOS8 (read iOS beta 4 Release note and the file system programming guide). When iOS8 will be installed on a device, I guess all previously installed applications and all related files (in Documents
  • Autolayout problems with iOS8 with code that works fine on iOS7
    I'm in the midst of developing an app for the iPhone and iPad. It supports iOS6 and iOS7 and it uses auto layout exclusively. This past week, when Apple announced that iOS8 was ready for prime-time, I upgraded one of my iPhones and an iPad both to iOS8. I also bumped my XCODE up to version 6. I have 2nd iPhone which I left at iOS7. I generated new executables with Xcode 6 and I was distressed to see that their screen layouts were messed up when executed on my devices running iOS8 but still fine on iOS7. This is true on both my physical devices and on Xcode's emulators. It took a lot of digging
  • IOS7/IOS8 在视图控制器中只允许纵向(IOS7/IOS8 Allow only portrait in view controller)
    问题 我正在为 iPhone 构建一个只有 1 个横向视图的应用程序,所以我想阻止所有其他横向视图,我试过这个: -(NSUInteger)supportedInterfaceOrientations { return UIInterfaceOrientationMaskPortrait; } 但它仍然旋转 回答1 我会建议只让你的应用程序为纵向模式,然后当你需要横向模式时,然后允许横向模式。 首先,按照之前的建议,单击 -> 项目名称 -> 常规 -> 部署信息 -> 仅选择纵向作为设备方向。 其次,在你的AppDelegate.h添加这个属性.. @property (nonatomic) BOOL fullScreenVideoIsPlaying; 然后,在您的AppDelegate.m我将添加此功能.. - (NSUInteger)application:(UIApplication *)application supportedInterfaceOrientationsForWindow:(UIWindow *)window{ if (self.fullScreenVideoIsPlaying == YES) { return UIInterfaceOrientationMaskAllButUpsideDown; } else { return
  • Scale affine transformation scaling differently on iOS7 and iOS8/iOS9 in Swift
    I am using scale affine transformations in Swift and have noticed CGAffineTransformMakeScale does not work the same on all iOS versions. To demonstrate the differences, I have created a new Xcode 7 project, set up three test boxes on the Xcode Storyboard running on an iOS7 device, iOS8 simulator and iOS9 simulator. Box A - has no constraints applied and is positioned centre top on the Storyboard Box B - has height and width set along with center horizontal and center vertical alignment constraints. Box C - has height and width set along with bottom space and center horizontal alignment
  • Presenting semi-transparent viewcontroller that works both in iOS7 and iOS8
    I had the following code that worked perfectly in iOS7. [UIView animateWithDuration:0.5 animations:^(void) { self.view.alpha = 0.5; [self.navigationController.navigationBar setAlpha:0.3]; }]; //to make the background view controller semi-transparent UIViewController *rootViewController = [UIApplication sharedApplication].delegate.window.rootViewController; [rootViewController setModalPresentationStyle:UIModalPresentationCurrentContext]; OverlayViewController *ctlr = [storyBoard instantiateViewControllerWithIdentifier:@"OverlayViewController"]; //present the OverlayViewController [self
  • Design app that supports both iOS8 and iOS7
    Suppose I want to design a master detail application, Xcode6 master-detail project template for universal app includes UISplitViewController and splitViewController is new in iOS8. I want to support app for iOS7 also. In general What is the best way to design an universal app using Xcode6 storyboard that support both iOS8 and iOS7 ? Is it better to use separate story board for different OS version ? What are the best practices we should follow to make app compatible with both OS?
  • UITableViewCell not clipping to bounds in editing mode in iOS8 (works in iOS7.1)
    I am setting the height of a UITableViewCell so that it will clip and not all the content for the row is visible. This works fine in iOS7 both "not edit" mode and "edit" mode. In iOS8 it is only working in "not edit" mode. When editing the entire content of the cell is shown after the red delete button on the left is tapped so that you see the delete button on the right. I had been setting cell.clipsToBounds = YES and thought this was all I needed to do. EDIT: I also tried cell.contentView.clipsToBounds = YES but this didn't work. iOS7: (this is what I want) iOS8: