Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Aula 2.1 - Erro em tempo de execução

Olá, bom dia.

Segue todas as instruções corretamente da aula 2.1, única coisa que fiz diferente foi a seguinte linha de código abaixo:

self.window.rootViewController = [ListaContatosViewController new];

Basicamente eu apontei direto para o set da variável window.

Entretanto, mesmo usando um ponteiro o seguinte erro é apresentado após carregamento da launchscreen:

2020-01-07 10:10:26.249768-0300 AgendaDeContatos[26006:6846944] -[AppDelegate window]: unrecognized selector sent to instance 0x6000001818e0
2020-01-07 10:10:26.253828-0300 AgendaDeContatos[26006:6846944] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[AppDelegate window]: unrecognized selector sent to instance 0x6000001818e0'
*** First throw call stack:
(
    0   CoreFoundation                      0x00007fff23c7127e __exceptionPreprocess + 350
    1   libobjc.A.dylib                     0x00007fff513fbb20 objc_exception_throw + 48
    2   CoreFoundation                      0x00007fff23c91fd4 -[NSObject(NSObject) doesNotRecognizeSelector:] + 132
    3   UIKitCore                           0x00007fff480c0f17 -[UIResponder doesNotRecognizeSelector:] + 302
    4   CoreFoundation                      0x00007fff23c759f6 ___forwarding___ + 838
    5   CoreFoundation                      0x00007fff23c77f78 _CF_forwarding_prep_0 + 120
    6   AgendaDeContatos                    0x000000010360a494 -[AppDelegate application:didFinishLaunchingWithOptions:] + 116
    7   UIKitCore                           0x00007fff48089ad8 -[UIApplication _handleDelegateCallbacksWithOptions:isSuspended:restoreState:] + 232
    8   UIKitCore                           0x00007fff4808b460 -[UIApplication _callInitializationDelegatesWithActions:forCanvas:payload:fromOriginatingProcess:] + 3980
    9   UIKitCore                           0x00007fff48090f05 -[UIApplication _runWithMainScene:transitionContext:completion:] + 1226
    10  UIKitCore                           0x00007fff477c57a6 -[_UISceneLifecycleMultiplexer completeApplicationLaunchWithFBSScene:transitionContext:] + 179
    11  UIKitCore                           0x00007fff4808d514 -[UIApplication _compellApplicationLaunchToCompleteUnconditionally] + 59
    12  UIKitCore                           0x00007fff4808d813 -[UIApplication _run] + 754
    13  UIKitCore                           0x00007fff48092d4d UIApplicationMain + 1621
    14  AgendaDeContatos                    0x0000000103609d84 main + 116
    15  libdyld.dylib                       0x00007fff5227ec25 start + 1
    16  ???                                 0x0000000000000001 0x0 + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException
(lldb) 

Antes que alguém pergunte, sim já procurei no google e em um monte de fórum e fiz diversas tentativa de consertar, porém todas sem sucesso. :(

3 respostas

Há, vi agora que meu arquivo AppDelegade.h não tinha a @property para a variável window. Codei as linhas abaixo, parou de acontecer o erro em tempo de execução mas a tela inicial não está sendo mudada para a ListaContatosViewController.

AppDelegade.h

@property (strong, nonatomic) UIWindow *window;

AppDelegade.m

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    ListaContatosViewController *lista = [ListaContatosViewController new];
    self.window.rootViewController = lista;
    return YES;
}

Fiz um simples debug colocando a linha de log abaixo antes e depois de setar o atributo rootViewController:

NSLog(@"window: %@", self.window.rootViewController);

E mesmo assim os dois vieram como null:

2020-01-07 11:33:50.137067-0300 AgendaDeContatos[26440:6910492] window: (null)
2020-01-07 11:33:50.138116-0300 AgendaDeContatos[26440:6910492] window: (null)

Outra coisa que já tentei foi esse adicionar esse trecho de código abaixo:

self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];

Dessa forma, no log evidência que de fato a variável window recebeu o apontamento da ListaContatosViewController, porém mesmo assim a tela inicial não é trocada.

2020-01-07 11:40:40.712553-0300 AgendaDeContatos[26455:6914826] window: (null)
2020-01-07 11:40:40.730008-0300 AgendaDeContatos[26455:6914826] window: <ListaContatosViewController: 0x7fe761d04da0>

Alguém poderia me ajudar?

solução!

Consegui resolver o problema mas não sei se está correto.

Todo o trecho de código que foi escrito no arquivo AppDelegate.m transferi para o arquivo SceneDelegate.m e funcionou corretamente.

SceneDelegate.m

- (void)scene:(UIScene *)scene willConnectToSession:(UISceneSession *)session options:(UISceneConnectionOptions *)connectionOptions {
    NSLog(@"window: %@", self.window.rootViewController);
    self.window.rootViewController = [ListaContatosViewController new];
    NSLog(@"window: %@", self.window.rootViewController);
}

Log

2020-01-07 11:51:12.835849-0300 AgendaDeContatos[26556:6924920] window: <ViewController: 0x7ff70de03c20>
2020-01-07 11:51:12.838926-0300 AgendaDeContatos[26556:6924920] window: <ListaContatosViewController: 0x7ff70dc0d920>

Como foi evidenciado no log, anteriormente o atributo já tinha valor, e após setar um novo há um novo apontamento.

Esse é de fato o método correto? Alterar a tela inicial via código no arquivo ScenceDelegate.m?

Bem, no fim das contas eu estava certo. A partir do iOS 13 a Apple retirou boa parte das responsabilidades do AppDelegate e designou que a classe SceneDelagate seria a responsável.

No link a seguir tem uma boa explicação sobre isso: https://www.donnywals.com/understanding-the-ios-13-scene-delegate/

Obrigado!

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software