Como adicionar um botão quando o controlador de vista é substituído em seu aplicativo ios
Porque você pode estar substituindo o controlador de exibição em seu aplicativo iOS com um novo - embora um da mesma classe base - o novo controlador de vista não tem acesso ao botão de que necessita para exibir ou o popover ele precisa descartar. Felizmente, o pessoal da Apple fornece um lugar perfeito para fazer isso.
Quando um segue é acionado - o que você faz quando você toca em uma entrada de mesa - mas antes de o novo controlador desliza seu ponto de vista no lugar, o tempo de execução de storyboard chama o controlador de vista atual&rsquo-s método de modo que ele pode passar os dados para o controlador de visualização que está prestes a ser exibida.
Isso significa que você pode passar a informação botão para o novo controlador de vista, antes mesmo de ser lançado. Então, prepareForSegue: remetente:, serão ambos atribuir o botão para ser usado em viewDidLoad e descartar o controlador de vista também.
prepareForSegue: remetente: é um método de controlador de visualização, que notifica um controlador de vista que um segue está prestes a ser executada. segue é o UIStoryboadSegue objeto, e contém informações sobre os controladores de vista envolvidos no segue.
Embora a implementação padrão desse método não faz nada,UIViewController subclasses pode substituí-lo e passar dados para o controlador de vista que está prestes a ser exibido. o segue objeto tem propriedades que apontam para o controlador de vista fonte, assim como o controlador de vista destino. A segue é o único objeto que sabe simultaneamente sobre a origem e a vista de destino controladores.
remetente é o objeto que causou a segue, mas você ganhou&rsquo-t necessidade de usá-lo aqui.
Você pode adicionar o código para o prepareForSegue: remetente: método para fazer o DestinationController a UISplitViewController delegar e atribuir o popOverButton e masterPopoverController propriedades.
Você&rsquo-LL também descartar a popover quando ele está presente para que o usuário doesn&rsquo-t tem que tocar no intuito de se livrar dele.
Para fazer tudo isso, adicione este código para MasterViewController.m.
- (Void) prepareForSegue: (UIStoryboardSegue *) segue remetente: (id) sender {if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad) {DetailViewController * currentDetailViewController-if ([[self.splitViewController.viewControllerslastObject] isKindOfClass: [classe UINavigationController ]]) currentDetailViewController = (DetailViewController *) ((UINavigationController *) [self.splitViewController.viewControllerslastObject]) topViewController-elsecurrentDetailViewController = [self.splitViewController.viewControllerslastObject] -se (currentDetailViewController.masterPopoverController = nil) [currentDetailViewController.masterPopoverControllerdismissPopoverAnimated:.! SIM ] -DetailViewController * destinationDetailViewController-se ([segue.destinationViewControllerisKindOfClass: [UINavigationController classe]]) = destinationDetailViewController (DetailViewController *) ((UINavigationController *) segue.destinationViewController) .topViewController-elsedestinationDetailViewController = segue.destination ViewController-self.splitViewController.delegate = destinationDetailViewCon Troller-destinationDetailViewController.popOverButton = currentDetailViewController.popOverButton-destinationDetailViewController.masterPopoverController = currentDetailViewController.masterPopoverController-}}
Você começa por encontrar a Visão Detalhada controlador de corrente porque tem as propriedades do botão e popover o novo controlador de vista precisa.
Este código parece mais complicado do que é. Você primeiro verificar para ver se você&rsquo-re rodando em um iPad. Se você é, você começa a Visão Detalhada controlador de corrente, acessando a lista de controladores de vista na splitViewController&rsquo-s viewController matriz. Felizmente, o UIViewController classe tem um splitViewController propriedade para fazer isso fácil para você.
Você, então, verificar para ver se um controlador de navegação é na viewControllers array e, se estiver lá, você obter o controlador de navegação&rsquo-s topViewController (O controlador de vista atual) - se não, você simplesmente usar o controlador na matriz. (Você&rsquo-notará um monte de fundição acontecendo aqui)
se ([[self.splitViewController.viewControllers X2028-LastObject]
isKindOfClass: [UINavigationController X2028 de classe]])
currentDetailViewController = (RTDetailViewController *)
(UINavigationController *)
[self.splitViewController.viewControllers
LastObject]). topViewController- outra
currentDetailViewController = x2028- [self.splitViewController.viewControllers
LastObject] -
Em seguida, se você ver um popover, você quer rejeitá-lo. Você verifica para ver se um controlador popover (que&rsquo-s por que você teve que fazer a propriedade acessível por movê-lo para o arquivo de cabeçalho.
Video: Botão power Virtual do iPhone
if (currentDetailViewController.masterPopoverController
!= Nil)
[currentDetailViewController.masterPopoverController
dismissPopoverAnimated: YES] -
Em seguida, você encontrar o novo controlador de destino (o que está sendo transferida para) usando uma lógica similar à lógica que usou para encontrar o Visão Detalhada controlador de corrente.
Video: Como esconder um aplicativo no IOS 7
se ([segue.destinationViewController
X2028-isKindOfClass: [UINavigationController
classe]]) = destinationDetailViewController
(DetailViewController *) ((UINavigationController *)
segue.destinationViewController) .topViewController- outra
destinationDetailViewController =
segue.destinationViewController-
Então você simplesmente definir o delegado de Split View Controller para o novo controlador de vista, por isso vai ter a splitViewController: willHideViewController:withBarButtonItem: forPopoverController: e splitViewController: willShowViewController: invalidatingBarButtonItem: mensagens.
self.splitViewController.delegate = destinationDetailViewController-
Finalmente, você atribuir o popOverButton e masterPopOverController propriedades do novo controlador de vista.
destinationDetailViewController.popOverButton =
currentDetailViewController.popOverButton-
destinationDetailViewController.masterPopoverController =
currentDetailViewController.masterPopoverController-
Evidentemente, isso só descarta a popover e atribui as propriedades, mas doesn&rsquo-t fazer nada para exibir o botão. Isso realmente é feito em viewDidLoad.
Você também pode especificar o tamanho da janela do popover, atribuindo um valor para a prefferedContentSize propriedade. Você deve estar ciente de que o tamanho real pode ser reduzida para que o popover se encaixa na tela e que o popover não se sobrepõe um teclado quando um teclado é apresentado. Você pode ver o código que faz isso na MasterViewController &rsquo-s awakeFromNib método.
- (Void) awakeFromNib {if ([[UIDevice currentDevice]
userInterfaceIdiom] == UIUserInterfaceIdiomPad)
X2028- {self.clearsSelectionOnViewWillAppear = NO-
self.preferredContentSize = CGSizeMake
(320.0, 600.0) -} [Super awakeFromNib] -}
o awakeFromNib mensagem é enviada a um objecto que foi instanciado do storyboard depois de todos os objectos tiverem sido carregados e inicializado. Quando a mensagem é enviada, todas as suas conexões de saída e ação foram definidas.
Se você decidir ignorar o conselho aqui e don&rsquo-t demitir o controlador popover, torneiras fora da janela do popover fará com que o popover de ser demitido. Você pode, no entanto, permitir que o usuário interagir com os pontos de vista específicos e não demitir o popover, usando o passthroughViews propriedade (embora você ganhou&rsquo-t estar fazendo isso aqui). Você&rsquo-d, em seguida, tem que demitir o popover si mesmo.