代码之家  ›  专栏  ›  技术社区  ›  Nimrod

由于uipopcovercontroller,通用iOS应用程序在iPhone/iTouch 3.1.3上崩溃

  •  2
  • Nimrod  · 技术社区  · 14 年前

    UIPopoverController 在某个地方。现在,这款应用似乎在3.1.3版iPhone/iTouch设备上崩溃了:

    OS Version:      iPhone OS 3.1.3 (7E18)
    Report Version:  104
    
    Exception Type:  EXC_BREAKPOINT (SIGTRAP)
    Exception Codes: 0x00000001, 0xe7ffdefe
    Crashed Thread:  0
    
    Dyld Error Message:
      Symbol not found: _OBJC_CLASS_$_UIPopoverController
    

    我不明白的是,如果硬件是iPad,我只想调用UIPopoverController:

    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
        UIPopoverController *popover = [[UIPopoverController alloc] initWithContentViewController:btc];
        CGSize popoverSize = { 300.0, 500.0 };
        popover.delegate = self;
        popover.popoverContentSize = popoverSize;
        self.bmPopover = popover;
        [popover release];
    
        [self.bmPopover presentPopoverFromBarButtonItem:self.bmBarButtonItem permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
    } else {
        [self presentModalViewController:nav animated:YES];
    }
    

    弹出控制器

    我该怎么做才能确保系统不与 弹出控制器

    5 回复  |  直到 14 年前
        1
  •  5
  •   Krzysztof Zabłocki    14 年前

    对于通用应用程序,您不仅应检查这是否是ipad或该类是否存在,还应将UIKit链接为弱引用非默认(强),以执行以下操作:

    1. 获取目标信息
    2. 选择常规
    3. 在链接库中,将所需的UIKit更改为UIKit弱

    享受制作通用应用程序的乐趣:]

        2
  •  1
  •   rickharrison    14 年前

    即使这段代码很可能永远不会在iPhone上运行,它仍然会被链接,因此您会收到错误。在实例化之前,需要检查类是否存在。您可以将上面的代码修改为下面的代码来修复它。

    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
        Class UIPopoverControllerClass = NSClassFromString(@"UIPopoverController");
        if (UIPopoverControllerClass != nil) {
            UIPopoverController *popover = [[UIPopoverControllerClass alloc] initWithContentViewController:btc];
            CGSize popoverSize = { 300.0, 500.0 };
            popover.delegate = self;
            popover.popoverContentSize = popoverSize;
            self.bmPopover = popover;
            [popover release];
    
            [self.bmPopover presentPopoverFromBarButtonItem:self.bmBarButtonItem permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
        }
    } else {
        [self presentModalViewController:nav animated:YES];
    }
    

    此外,您还可以针对UIKit框架建立弱链接,这也可以解决问题。我更喜欢代码解决方案,因为它更安全。

        3
  •  0
  •   Ben    14 年前

    您需要通过从字符串引用类来停止编译器错误。这应该与UI_USER_INTERFACE_IDIOM()一起使用,并将在不知道UIPopoverController的SDK上编译。下面是一个例子:

    Class popClass = NSClassFromString(@"UIPopoverController");
    if(popClass) {
        id infoPop = [[popClass alloc] initWithContentViewController:popViewController];
        [infoPop presentPopoverFromRect:CGRectMake(20, 70, 10, 10) inView:self.view permittedArrowDirections:4 animated:YES];
    }
    
        4
  •  -1
  •   DavidPhillipOster    14 年前

    在Xcode项目中,选择顶级项目图标。做一个 显示简介 ,转到 面板。设置 所有配置 ,设置 显示:

    设置 到iOS3.1。

    重新编译。您的程序失败,因为最小操作系统设置得太高,所以加载程序无法解析符号 . 我刚才给您介绍的更改使这个符号变得很弱:它将解析为空,但至少您的程序将加载。


    您是否正在加载隐式创建UIPopoverController的NIB文件?那是另一种崩溃的方式。

        5
  •  -1
  •   westsider    14 年前

    #ifndef __IPHONE_3_2    // if iPhoneOS is 3.2 or greater then __IPHONE_3_2 will be defined
    
    typedef enum {
        UIUserInterfaceIdiomPhone,           // iPhone and iPod touch style UI
        UIUserInterfaceIdiomPad,             // iPad style UI
    } UIUserInterfaceIdiom;
    
    #define UI_USER_INTERFACE_IDIOM() UIUserInterfaceIdiomPhone
    
    #endif // ifndef __IPHONE_3_2