UIActionSheet 在 iOS6 中运行良好,但在 iOS7 中崩溃——数据结构有问题
Posted
技术标签:
【中文标题】UIActionSheet 在 iOS6 中运行良好,但在 iOS7 中崩溃——数据结构有问题【英文标题】:UIActionSheet works fine in iOS6 but crashes in iOS7 -- data structures were at fault 【发布时间】:2013-12-03 09:50:04 【问题描述】:编辑:错误在于 PDF 生成期间使用的数据结构。一旦获得支持 ios7 的 OSX 副本,我将能够对其进行调试。感谢大家的帮助!
在工作中,我有专门用于处理 iOS 6 应用程序的 Mac。到目前为止,还无法更新到更新版本的 OSX,因此我的 XCode 版本无法自然升级以支持 iOS7。长话短说,我无法调试 iOS7 应用程序,所以我不确定应用程序崩溃的原因。
我有一个 UIActionSheet。我曾经使用一个带有这些完成块的工具,但当时我正在尝试调试,所以我将所有东西都剥离了,只剩下基本的准系统,当我点击按钮时它仍然崩溃。
UIActionSheet* actionSheet = [[UIActionSheet alloc] initWithTitle:nil delegate:nil cancelButtonTitle:@"Cancel" destructiveButtonTitle:nil otherButtonTitles:@"Send by Email", @"Send To...", @"Open In...", nil ];
[actionSheet showFromBarButtonItem:sender animated:YES];
这只是 PDF 生成方法的结尾。
有什么想法吗?我整个下午都在研究这个,我还没有找到任何理由让它停止像这样工作。我确实尝试将操作表作为数据存储在视图控制器中,以便保留引用,但无济于事。
我正在使用 ARC。
编辑:我尝试了 UIAlertView,结果相同。也许是 PDF 上下文以某种方式破坏了事情?
感谢大家的帮助。
编辑: 解决这个问题的重大突破:在我的操作表/模态对话框/警报视图之前注释掉我的 PDF 生成代码时,它会毫无怨言地打开。所以这是某种混合问题,我将在此处发布我的大部分方法,以便每个人都可以看到发生了什么:
-(void)shareTapped:(id)sender
if (actionSheet.isVisible)
return;
if (![MFMailComposeViewController canSendMail])
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"No mail setup" message:@"You must setup your email in the main settings app before you can share." delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];
[alert show];
return;
for( NSIndexPath *indexPath in self.tableView.indexPathsForSelectedRows )
// should only get run once due to UI
Calculation* calc = [self.fetchedResultsController objectAtIndexPath:indexPath];
NSString *filename = [calc.name stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
NSString *path = [[[[self applicationDocumentsDirectory] path] stringByAppendingPathComponent:filename] stringByAppendingPathExtension:@"ipc"];
[[PPCalculation sharedInstance] openCalculation:path];
[[PPCalculation sharedInstance] calculate];
// let's generate the PDF here!
NSMutableData* pdfData = [[NSMutableData alloc] init];
UIGraphicsBeginPDFContextToData( pdfData, CGRectZero, nil );
UIGraphicsBeginPDFPage();
// 200 lines of drawing commands here
UIGraphicsEndPDFContext();
// save to file
NSString* path;
for( NSIndexPath *indexPath in self.tableView.indexPathsForSelectedRows )
// should only get run once due to UI
Calculation* calc = [self.fetchedResultsController objectAtIndexPath:indexPath];
NSString* filename = [calc.name stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
path = [[[[self applicationDocumentsDirectory] path] stringByAppendingPathComponent:filename] stringByAppendingPathExtension:@"pdf"];
[[NSFileManager defaultManager] createFileAtPath:path
contents:pdfData
attributes:nil];
// ActionSheet, modal dialog, composer dialog, alert view, all of them crash when I try to put them here
UIActionSheet* sheet = [[UIActionSheet alloc] initWithTitle:@"Share" delegate:nil cancelButtonTitle:@"Cancel" destructiveButtonTitle:nil otherButtonTitles:@"Send By Email", nil];
[sheet showFromBarButtonItem:sender animated:YES];
再次感谢各位。
编辑:从我的调查和逐行注释并通过 TestFlight 将它们发送到设备看来,这是内部数据结构不知何故无法正常工作,这很奇怪,因为该应用程序的其余部分工作正常。我可能会得到一份山狮或其他东西的副本,这样我就可以正确调试这个东西了。
【问题讨论】:
什么是崩溃错误信息? 这是我的问题。我无法调试它,因为我运行的 xcode 版本太旧了,这是老板的 iPhone。 :(。所以它只是在没有消息的情况下崩溃到桌面,因为它们显然是这样工作的。[[UIActionSheet alloc] initWithTitle:nil: delegate:nil
部分一开始看起来很奇怪。你应该确保你在 Objective-C 中学习了正确的消息调用。试试[[UIActionSheet alloc] initWithTitle:@"mytitle" delegate:nil
或[[UIActionSheet alloc] initWithTitle:nil delegate:nil
。
这是一个通用应用程序。并且感谢 Jonny,这对我来说是一个糟糕的复制/粘贴(由于 Mac 不允许我登录 SO,必须手动输入)。我确实听过你的建议,但它不喜欢我。
这似乎不是UIActionSheet造成的,你可以注释最后两行代码并再次测试,检查应用程序在iOS 7中是否仍然崩溃。如果是这样,可能是pdf绘图代码出现问题。跨度>
【参考方案1】:
试试下面的代码...也许它会帮助你...
UIActionSheet *actionSheet = [[UIActionSheet alloc] initWithTitle:nil delegate:self cancelButtonTitle:@"Cancel" destructiveButtonTitle:nil otherButtonTitles:@"Send by Email", @"Send To...", @"Open In...", nil];
//actionSheet.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin;
actionSheet.actionSheetStyle = UIActionSheetStyleBlackTranslucent;
actionSheet.tag = ((UIButton*)sender).tag;
[actionSheet showFromRect:[(UIButton*)sender frame] inView:[(UIButton*)sender superview] animated:YES];
【讨论】:
我点击的是 UIBarButtonItem 而不是普通按钮!所以我不能像那样得到发件人的框架。【参考方案2】:通过反复试验和注释代码,我将其范围缩小到 PDF 生成本身。在 C++ 数据结构的某个地方,正在发生一些让 iOS7 悲伤的事情,但其他的都很好。我已经说服老板订购了 Mountain Lion,所以一旦到货,我就可以直接为 iOS7 构建并正确调试它。
【讨论】:
最后,它在一个文字 C 字符串上使用了 strcpy。在较旧的操作系统上很好,iOS7 无法处理。无论如何,我承认这是一种不好的做法,所以缓冲区在所有方面都能很好地工作。【参考方案3】:试试这个对你有帮助
你的 barbutton 操作方法:
UIActionSheet* actionSheet = [[UIActionSheet alloc] initWithTitle:nil: delegate:nil cancelButtonTitle:@"Cancel" destructiveButtonTitle:nil otherButtonTitles:@"Send by Email", @"Send To...", @"Open In...", nil ];
[actionSheet showInView:self.view];
【讨论】:
以上是关于UIActionSheet 在 iOS6 中运行良好,但在 iOS7 中崩溃——数据结构有问题的主要内容,如果未能解决你的问题,请参考以下文章