Pergunta

Com certeza parece bastante inócua. Na minha App Delegado, eu verifico NSUserDefaults para uma bandeira para mostrar dicas na inicialização. Se for definido, em seguida, no final da applicationDidFinishLaunching:, eu faço isso:

TipsViewController *vc = [[TipsViewController alloc]
  initWithNibName:@“TipsView" bundle:nil];
[window addSubview:vc.view];
[vc release];

A idéia é mostrar essa visão temporariamente. (Note-se que não é um modal VC. Não Controlador de navegação neste momento, mais não há nenhuma barra de navegação nesta vista de qualquer maneira.)

Uma vez que este ponto de vista é rejeitado, vamos adicionar o nosso antecipou-se UITabBarController ’s vista para a janela e transição até lá, em seguida, remover o ponto de vista da ponta da janela principal. Eu não ter feito isso para o ponto de vista demissão ainda porque, bem, manter a leitura.

VC Meu TipsView é ligado mais ou menos assim:

UIView -> view -> File’s Owner (TipsViewController)
  UIImageView -> background image
  UIView -> tipView -> File’s Owner
    UIImageView -> background image
    UIScrollView
      UILabel (tip text)
    UIButton -> touch-up-inside -> -(IBAction)button1:
    UIButton -> touch-up-inside -> -(IBAction)button2:
    UIButton -> touch-up-inside -> -(IBAction)button3:

A fonte contém declarações e definições para todos os três IBAction chamadas. Agora dois deles não fazem nada. O terceiro altera o text ponta, redimensiona-lo para caber, e ajusta contentSize da exibição da rolagem para corresponder.

Quando eu executar o aplicativo, os TipsViewController vista aparece apenas multa. Posso até percorrer o texto dica. No entanto, quando eu disparar um toque-up-dentro em qualquer UIButton , Xcode começa a me plantar na fonte (onde eu tenho colocado um ponto de interrupção em cada IBAction ) ... e, em seguida, afiança para fora com qualquer um EXC_BAD_ACCESS ou obj_stack_overflow.

Eu compararam isso com outras partes do aplicativo onde eu tenho um VC, uma visão, e botões. Ele é idêntico em todos os sentidos, exceto que, neste caso, Eu adicionei vista de um VC como um subview da janela do aplicativo, em vez de empurrar o VC em um Controlador de navegação . Além disso, o View Controller Guia de Programação para o iPhone OS docs dizer que este é um jogo justo:

Se você usar um único controlador de vista em sua aplicação, você adicionar a sua vista a uma janela em vez de adicionar o ponto de vista controlador para um guia ou barra de navegação controlador.

É verdade, eu do ter um UITabBarController esperando nas asas, e tem abas com UINavigationControllers (e outros VCs) nele. No entanto, se está sendo mostrado a visão ponta, a visão de controlador de bar na guia possui não foi ainda adicionada à janela. A intenção é trocá-lo depois que terminamos mostrar sugestões. Em outras palavras, para todos os efeitos, estamos agindo temporariamente como nós temos um único VC no jogo. Depois, nós mudar para a barra de abas e derrubar a ponta VC.

Talvez eu estou fazendo algo sutilmente errado? Existe uma maneira melhor? ( “Tem que haver uma maneira melhor!”)

rastreamento de pilha Amostra:

#0  0x992b6f52 in objc_exception_throw
#1  0x302d6ffb in -[NSObject doesNotRecognizeSelector:]
#2  0x3026e056 in ___forwarding___
#3  0x3024a0a2 in __forwarding_prep_0___
#4  0x308f79d1 in -[UIApplication sendAction:to:from:forEvent:]
#5  0x309598b1 in -[UIControl sendAction:to:forEvent:]
#6  0x3095bad2 in -[UIControl(Internal) _sendActionsForEvents:withEvent:]
#7  0x3095a81e in -[UIControl touchesEnded:withEvent:]
#8  0x30910fdf in -[UIWindow _sendTouchesForEvent:]
#9  0x308faecb in -[UIApplication sendEvent:]
#10 0x309013e1 in _UIApplicationHandleEvent
#11 0x32046375 in PurpleEventCallback
#12 0x30245560 in CFRunLoopRunSpecific
#13 0x30244628 in CFRunLoopRunInMode
#14 0x32044c31 in GSEventRunModal
#15 0x32044cf6 in GSEventRun
#16 0x309021ee in UIApplicationMain
#17 0x00002888 in main at main.m:14

Como você pode ver a partir do traço, que acabam em doesNotRecognizeSelector: ... exceto eu posso ver claramente os métodos na minha dica fonte de VC. Além disso, eles estão todos conectados up. (Sem várias fiações ou qualquer coisa assim em IB. Tudo parece bom lá, até relações do proprietário do arquivo.)

Clues boas-vindas / apreciada!

Foi útil?

Solução

O problema é logo ali na sua primeira trecho de código: você está criando uma instância de TipsViewController, mantendo o seu ponto de vista, em seguida, liberando o controlador de vista - o que fará com que ele seja desalocada. Portanto, agora o target dos botões é um ponteiro para o controlador de vista desalocada.

A visão não manter o seu controlador de vista, nem reter seus delegados ou alvos.

Você tem que manter a instância controlador de vista manteve-talvez em um retain propriedade-por tanto tempo quanto você quer a imagem a ser exibida. Quando você é feito com a vista, você pode removê-lo a partir de seu ponto de vista dos pais, e liberar o controlador de vista.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top