菜鸟教程小白 发表于 2022-12-12 16:46:40

ios - 尝试在 iPhone 上模态显示 UIImagePickerController 时崩溃


                                            <p><p>当我尝试从特定 ViewController 呈现 <code>UIImagePickerController</code> 时,我的应用程序崩溃了。 </p>

<p>我有一个对象 <code>CLYImagePickerController</code>,它为 <code>UIImagePickerController</code> 处理简单的事情,例如创建、呈现和处理 <code>UIAlertView</code>为用户提供关于要呈现哪种 <code>UIImagePickerController</code> 的选项,并处理用户选择的图像。该对象告诉委托(delegate) ViewController 使用以下方法呈现 <code>UIImagePickerController</code>:</p>

<pre><code>- (void)showImagePickerForSourceType:(UIImagePickerControllerSourceType)sourceType
{
    UIImagePickerController *imagePickerController = [ init];
    imagePickerController.modalPresentationStyle = UIModalPresentationCurrentContext;
    imagePickerController.sourceType = sourceType;
    imagePickerController.delegate = self;

    ;
}
</code></pre>

<hr/>

<p><strong>2013 年 11 月 27 日编辑:</strong>
<code>self</code> 是第二段中描述的 <code>CLYImagePickerController</code>。它只是一个 NSObject 子类。 <code>CLYImagePickerController</code>的<code>delegate</code>定义如下:</p>

<pre><code>@property (weak, nonatomic) UIViewController &lt;CLYImagePickerControllerDelegate&gt; *delegate;
</code></pre>

<p><code>CLYImagePickerController</code> 的目的是允许 ViewController (<code>delegate</code>)调用它以在 ViewController 的 View 中显示操作表,当执行时on 可以调用 <code>UIImagePickerController</code> ,其源类型由被点击的操作表按钮确定。基本上,<code>CLYImagePickerController</code> 处理一堆重复的代码,否则这些代码会使 <code>delegate</code>ViewController 的代码变得困惑,并允许在使用图像选择器的整个应用程序中实现统一的呈现风格。</p>

<hr/>

<p>对于一个特定的 ViewController ,它恰好很大,因为它处理 <code>UITableView</code> 以及 <code>UITextView</code> 的许多方面,呈现 <code>UIImagePickerController</源类型 <code>UIImagePickerControllerSourceTypePhotoLibrary</code> 的 code> 几乎每次都会导致应用程序崩溃并出现 <code>EXC_BAD_ACCESS</code> 异常(在少数情况下,启动选择器时应用程序不会崩溃,但是在不对项目进行任何更改的情况下进行重建通常会扭转这种情况,并且应用程序将再次开始崩溃)。再次强调,这些崩溃<strong>只有在提供源类型为 <code>UIImagePickerControllerSourceTypePhotoLibrary</code> 的 <code>UIImagePickerController</code> 时才会发生。</strong> 提供 <code>源类型为 <code>UIImagePickerControllerSourceTypeCamera</code> 的 UIImagePickerController</code> 可以正常启动。</p>

<p>我在帖子底部提供了其中一次崩溃的崩溃日志。 </p>

<p>为了确保问题不在于我的 <code>CLYImagePickerController</code> 对象,我使用空 ViewController 对其进行了测试,该 Controller 的唯一功能是充当 <code>CLYImagePickerController</code> 的委托(delegate).在此 View 中,<code>UIImagePickerController</code> 对于两种源类型每次都正确启动而不会失败。这让我相信有问题的 ViewController 的代码中有一些东西以某种方式干扰了 <code>UIImagePickerController</code>,但我不知道它可能是什么。有没有其他人遇到过类似的问题,可以对这个问题有所了解吗?</p>

<p>奇怪的是,在测试 View 中启动具有照片库源类型的选取器后,问题 ViewController 能够呈现具有照片库源类型的选取器而没有任何问题。当我第一次呈现具有源类型 <code>UIImagePickerControllerSourceTypePhotoLibrary</code> 的 <code>UIImagePickerController</code> 时,是否在全局范围内设置了某些内容,这允许我在有问题的 ViewController 中再次呈现它而不会出现问题?</p >

<h2>崩溃日志</h2>

<p>以下是其中一次崩溃的示例堆栈跟踪。我真的不知道这一切意味着什么。似乎在某处访问与字体相关的内容时出现了某种问题?我不知道。</p>

<pre><code>Thread 0: Crashed: com.apple.main-thread
0CoreText                     0x2db76d52 TComponentFont::GetRawBoundingBox() const + 13
1CoreText                     0x2db69bcf TBaseFont::CalculateFontMetrics(bool) const + 110
2CoreText                     0x2db69bcf TBaseFont::CalculateFontMetrics(bool) const + 110
3CoreText                     0x2db76d3f TComponentFont::CalculateFontMetrics(bool) const + 34
4CoreText                     0x2db69a15 TBaseFont::InitFontMetrics() const + 44
5CoreText                     0x2db69851 TBaseFont::GetStrikeMetrics(float, CGAffineTransform const*, bool) const + 104
6CoreText                     0x2db6961f TFont::InitStrikeMetrics() const + 38
7CoreText                     0x2db695cd CTFontGetAscent + 92
8GraphicsServices               0x321122c5 GSFontEnsureExtraData + 228
9GraphicsServices               0x321143dd GSFontGetLatin1LayoutInfo + 44
10 UIFoundation                   0x34e0f49d - + 12
11 UIFoundation                   0x34de5be7 __NSStringDrawingEngine + 3814
12 UIFoundation                   0x34deae4b - + 902
13 UIKit                        0x2ff24383 - + 594
14 UIKit                        0x2fcc8b9f - + 206
15 PhotosUI                     0x33d620df -
16 PhotosUI                     0x33cb82f5 +
17 libobjc.A.dylib                0x37803271 _class_initialize + 572
18 libobjc.A.dylib                0x3780a7cf lookUpImpOrForward + 130
19 libobjc.A.dylib                0x3780302b _class_lookupMethodAndLoadCache3 + 34
20 libobjc.A.dylib                0x37802df9 _objc_msgSend_uncached + 24
21 PhotosUI                     0x33cb720d -
22 UIKit                        0x2fd61315 - + 408
23 UIKit                        0x2fd096cd - + 1800
24 UIKit                        0x2fd08ef1 - + 184
25 UIKit                        0x2fc2f353 - + 346
26 QuartzCore                     0x2f8b5943 - + 142
27 QuartzCore                     0x2f8b1167 CA::Layer::layout_if_needed(CA::Transaction*) + 350
28 UIKit                        0x2fc44231 - + 532
29 PhotosUI                     0x33d7aca9 -
30 UIKit                        0x2fc2f429 - + 560
31 QuartzCore                     0x2f8b5943 - + 142
32 QuartzCore                     0x2f8b1167 CA::Layer::layout_if_needed(CA::Transaction*) + 350
33 QuartzCore                     0x2f8b0ff9 CA::Layer::layout_and_display_if_needed(CA::Transaction*) + 16
34 QuartzCore                     0x2f8b0a0d CA::Context::commit_transaction(CA::Transaction*) + 228
35 QuartzCore                     0x2f8b081f CA::Transaction::commit() + 314
36 QuartzCore                     0x2f8aa54d CA::Transaction::observer_callback(__CFRunLoopObserver*, unsigned long, void*) + 56
37 CoreFoundation               0x2d475f69 __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 20
38 CoreFoundation               0x2d4738f7 __CFRunLoopDoObservers + 286
39 CoreFoundation               0x2d473c43 __CFRunLoopRun + 738
40 CoreFoundation               0x2d3de471 CFRunLoopRunSpecific + 524
41 CoreFoundation               0x2d3de253 CFRunLoopRunInMode + 106
42 GraphicsServices               0x321182eb GSEventRunModal + 138
43 UIKit                        0x2fc93845 UIApplicationMain + 1136
44 Celly                        0x0000cde3 main (main.m:17)
</code></pre></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>这个怎么样:</p>

<pre><code>- (void) showImagePickerForSourceType:(UIImagePickerControllerSourceType)sourceType
{   
    if ()
    {
      UIImagePickerController *imagePickerController = [ init];
      imagePickerController.sourceType = sourceType;
      imagePickerController.delegate = self;
      ;
      // if this doesn&#39;t work try using:
      // if () {
      //    [self.providerDelegate performSelectorOnMainThread:@selector(showImagePicker:)
      //                                          withObject:imagePickerController
      //                                       waitUntilDone:NO];
      //}
    }
}
</code></pre></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 尝试在 iPhone 上模态显示 UIImagePickerController 时崩溃,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/20223295/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/20223295/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 尝试在 iPhone 上模态显示 UIImagePickerController 时崩溃