Símbolo não encontrado:_OBJC_CLASS_$_UIPopoverController
-
25-09-2019 - |
Pergunta
Estou tendo problemas com meu app universal.Eu tenho definir a Base do SDK para iPhone 3.2 e definir o destino para 3.1.
Eu movi os arquivos que estão usando o UIPopoverController para seus próprios arquivos e eles não deveriam ser carregado quando carregar o app no iPhone.Ainda assim, quando eu construir a minha aplicação eu recebo o seguinte erro quando eu criar e depurar para o meu dispositivo:
dyld:Símbolo não encontrado:_OBJC_CLASS_$_UIPopoverController Referenciado a partir de:/var/mobile/Applications/B3B90643-92DC-4E5C-8B2F-83A42D6D57E0/citybikes.app/citybikes Esperado em:/System/Library/Frameworks/UIKit.quadro/UIKit no /var/mobile/Applications/B3B90643-92DC-4E5C-8B2F-83A42D6D57E0/citybikes.app/citybikes
Eu realmente espero que alguém possa me ajudar.
Melhores cumprimentos, Paulo Peelen
Solução
Mesmo se eles não são carregados em tempo de execução, os arquivos ainda são transformados em links.O símbolo _OBJC_CLASS_$_UIPopoverController
é, portanto, adicionados ao seu aplicativo como um daqueles que precisam de ligação dinâmica.
Existem 2 soluções alternativas,
- Substituir toda a aparência do UIPopoverController em uma mensagem (e.g.
[UIPopoverController alloc]
) comNSClassFromString(@"UIPopoverController")
, ou - Fazer UIKit fracamente ligados.
Outras dicas
Eu recomendo fortemente você não Link fracamente o uikit. Como Kennytm e eu mencionamos em nossos comentários, isso pode ocultar problemas futuros do vinculador e resultar em falhas. Também não estou confortável em dizer ao ligante que o UIKIT é opcional quando não é claramente. Big Hack.
Em vez disso, inicialize e ligue para o UipopoverController usando indiretamente o NSCLASSFROMSTRING:
Class popover = NSClassFromString(@"UIPopoverController");
if (nil != popover)
{
self.myPopover = [[popover alloc] initWithContentViewController:myContent];
}
Se você ainda tiver erros de ligação, pode ser necessário chamar as mensagens do UipopoverController usando o NSSELECTOREFROMSTRING:
Class popover = NSClassFromString(@"UIPopoverController");
if (nil != popover)
{
SEL myInit = NSSelectorFromString(@"initWithContentViewController:");
self.myPopover = [[popover alloc] performSelector:myInit withObject:myContent];
}
Para a portabilidade, recomendo escrever um objeto de proxy para lidar com esses detalhes da implementação.