此代码适用于 iOS4.3 而不是 iOS5
Posted
技术标签:
【中文标题】此代码适用于 iOS4.3 而不是 iOS5【英文标题】:This Code works on iOS4.3 not iOS5 【发布时间】:2011-10-13 00:55:57 【问题描述】:以下代码在 ios4.3 iPhone 和 iPad 以及 iOS5 iPhone 上按预期工作,但在 iOS5 iPad 上崩溃。当应用程序的先前运行被取消时,这是我在基于选项卡的应用程序中调用的第一个视图。用户可以继续之前的运行或重置。我尝试将此代码移至 -viewWillAppear 和 -viewDidAppear 割线,但无济于事。有没有其他人经历过这个? (顺便说一句,我已经确认了我的 XIB 中的所有连接,以确保这个 UniversalApp 的 iPad 部分没有问题。
- (void)viewDidLoad
BOOL continueYesNo;
NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
continueYesNo = [prefs boolForKey:@"keyContinueMeeting"];
if (continueYesNo)
NSString *message_continue = [[NSString alloc] initWithFormat:@"Do you want to Continue the Prior event"];
UIActionSheet *actionSheet = [[UIActionSheet alloc]
initWithTitle:message_continue
delegate:self
cancelButtonTitle:@"Reset"
destructiveButtonTitle:@"Continue Meeting"
otherButtonTitles:nil];
[actionSheet showFromTabBar:self.tabBarController.tabBar]; // This is the line that crashes. The program checks for a terminated APP and status in preferences
else
resetStuff.hidden = YES;
这是崩溃的文本 -
Current language: auto; currently objective-c
2011-10-12 21:02:55.530 浪费时间[3884:17603] * -[UIActionSheet showInView:], /SourceCache/UIKit_Sim/UIKit-1912.3/UIActionSheet.m:4630 中的断言失败 2011-10-12 21:02:55.532 应用程序名称[3884:17603] 由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“无效参数不满足:视图!= nil ' ** 首先抛出调用堆栈: (0x1d87052 0x1f18d0a 0x1d2fa78 0x2742db 0x90b47e 0x90b122 0x90b356 0x90b653 0x6fe1 0x60064e 0x61bb89 0x61b9bd 0x619f8a 0x619e2f 0x617ffb 0x61885a 0x601fbf 0x60221b 0x6030f1 0x571fec 0x577572 0x57172b 0x2b86 0x5389d6 0x5398a6 0x548743 0x5491f8 0x53caa9 0x2315fa9 0x1d5b1c5 0x1cc0022 0x1cbe90a 0x1cbddb4 0x1cbdccb 0x5392a7 0x53aa9b 0x2abd 0x2325) 终止称为抛出异常(gdb
块引用
这是委托.h
#import <UIKit/UIKit.h>
@interface W_AppDelegate : NSObject <UIApplicationDelegate>
UIWindow *window;
UITabBarController *rootController;
float floatVal;
NSDate *currentTime;
NSDate *previousTime;
NSDate *currentQTime;
NSDate *previousQTime;
BOOL continueMeeting;
@property (nonatomic, retain) IBOutlet UIWindow *window;
@property (nonatomic, retain) IBOutlet UITabBarController *rootController;
@property (nonatomic, readwrite) float floatVal;
@property (nonatomic, readwrite) BOOL continueMeeting;
@property (nonatomic, retain) NSDate *currentTime;
@property (nonatomic, retain) NSDate *previousTime;
@property (nonatomic, retain) NSDate *currentQTime;
@property (nonatomic, retain) NSDate *previousQTime;
@end
还有.m
#import "W.h"
@implementation W_AppDelegate
@synthesize window;
@synthesize rootController;
@synthesize floatVal;
@synthesize currentTime;
@synthesize previousTime;
@synthesize currentQTime;
@synthesize previousQTime;
@synthesize continueMeeting;
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
[window addSubview:rootController.view];
[window makeKeyAndVisible];
return YES;
@end
【问题讨论】:
请提供有关崩溃的更多信息。我们很懒,想看看它为什么会崩溃,然后我们会从那里找到导致它崩溃的原因。 【参考方案1】:尝试调用您的 [super viewDidLoad];第一的。您的视图可能还没有设置到足以推送 actionSheet。
【讨论】:
我认为这是缺少的部分。谢谢!【参考方案2】:您是否为此项目启用了 ARC(自动引用计数)?如果没有 ARC,您将在 if 语句的主分支中泄漏对象。
启用 ARC 后,它将为您释放这些对象,这是您可能没有预料到的,这会导致问题。
编辑:您的标签栏似乎尚未加载(或:已加载但现在已卸载)。如果 ARC 认为它不应该再坚持下去,就会发生这种情况。当你调用 actionSheet 来展示自己时,检查以确保 self.tabBarController
指向真实的东西。
我可以说这是因为抛出了异常,它或多或少是在说“你正试图以 nil 视图呈现它”。那是程序员的错误。我的猜测是,您之前在其他地方泄漏了 tabBarController,现在您已经使用了 ARC,该泄漏会自动为您清理,并且 tabBarController 正在被释放。
【讨论】:
是的,我正在使用 ARC... 试图利用它来做其他事情。使用崩溃更新原始帖子 感谢更新。我查看了我的 App Delegate(见上文),UITabBarController 被称为 rootController。但是当我尝试引用它时,我发现它没有 TabBar。这是我在应用程序中加载的第一件事。不知道它怎么会消失。另外,这不应该在 iPhone 上也失败吗?但它运行良好。 你如何加载并按住 TabBar?【参考方案3】:从错误文本:view != nil
from [UIActionSheet showInView:]
,视图为零。 actionSheet
或 self.tabBarController.tabBar
要么为零。添加一些 NSLog 来验证两者都不是 nil。
让事情变得更简单,替换:
NSString *message_continue = [[NSString alloc] initWithFormat:@"Do you want to Continue the Prior event"];
与
NSString *message_continue = @"Do you want to Continue the Prior event";
您的代理设置如何?
【讨论】:
感谢您进行了更改,然后使用 App Delegate 信息更新了原始帖子 添加日志以显示 &actionSheet 和 &self.tabBarContoller 以下是输出:10 月 12 日 21:35:00 Michaels-iMac APP[4419]: actionSheet -1073751500 Oct 12 21:35:00 Michaels- iMac APP [4419]:tabBarController 154610512 Oct 12 21:35:00 Michaels-iMac APP [4419]:*** -[UIActionSheet showInView:] 中的断言失败,/SourceCache/UIKit_Sim/UIKit-1912.3/UIActionSheet.m:4630 10 月 12 日 21:35:00 Michaels-iMac APP [4419]:*** 由于未捕获的异常而终止应用程序 你不想在这里使用 &。它会给你指向变量的地址。留下它以获取它指向的地址。以上是关于此代码适用于 iOS4.3 而不是 iOS5的主要内容,如果未能解决你的问题,请参考以下文章