Symbol not found: _OBJC_CLASS_$_UIPopoverController

ε祈祈猫儿з 提交于 2019-12-17 22:36:39

问题


I am having problems with my universal app. I have set the Base SDK to iPhone 3.2 and set the target to 3.1.

I have moved the files that are using the UIPopoverController to their own files and they shouldn't be loaded when loading the app on the iPhone. Still, when I build my app I get the following error when I build and debug to my device:

dyld: Symbol not found: _OBJC_CLASS_$_UIPopoverController Referenced from: /var/mobile/Applications/B3B90643-92DC-4E5C-8B2F-83A42D6D57E0/citybikes.app/citybikes Expected in: /System/Library/Frameworks/UIKit.framework/UIKit in /var/mobile/Applications/B3B90643-92DC-4E5C-8B2F-83A42D6D57E0/citybikes.app/citybikes

I really hope someone can help me.

Best regards, Paul Peelen


回答1:


Even if they're not loaded in runtime, those files are still processed in linking. The symbol _OBJC_CLASS_$_UIPopoverController is therefore added into your app as one of those requiring dynamic linking.

There are 2 workarounds,

  1. Replace all appearance of UIPopoverController in a message (e.g. [UIPopoverController alloc]) with NSClassFromString(@"UIPopoverController"), or
  2. Make UIKit weakly linked.



回答2:


I strongly recommend you not weakly link UIKit. As KennyTM and I mentioned in our comments, this may hide future linker issues and result in crashes. I'm also simply not comfortable with telling the linker that UIKit is optional when it plainly isn't. Big hack.

Instead, initialize and call UIPopoverController indirectly using NSClassFromString:

Class popover = NSClassFromString(@"UIPopoverController");
if (nil != popover)
{
    self.myPopover = [[popover alloc] initWithContentViewController:myContent];
}

If you still have linker errors, you may need to call UIPopoverController's messages using NSSelectorFromString:

Class popover = NSClassFromString(@"UIPopoverController");
if (nil != popover)
{
    SEL myInit = NSSelectorFromString(@"initWithContentViewController:");
    self.myPopover = [[popover alloc] performSelector:myInit withObject:myContent];
}

For portability, I recommend writing a proxy object to handle these implementation details.



来源:https://stackoverflow.com/questions/3001374/symbol-not-found-objc-class-uipopovercontroller

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!