Visualizações personalizadas com Storyboard


96

Em telas complexas (View Controllers) eu costumava separar tudo em pedaços menores (eu os chamo de widgets). Estes elementos consistem, basicamente, de um MyWidget.he de um MyWidget.marquivo, bem como um MyWidget.xibarquivo, onde o elemento raiz é uma UIViewea classe MyWidget é o proprietário do arquivo da UIView. No init deste widget eu faço a loadNibNamed.

Em meu View Controller, faço um [[MyWidget alloc] init], que adiciono à visualização principal do View Controller como uma subvisão. Isso, até agora, funciona perfeitamente.

Agora estou me perguntando como fazer o mesmo com o storyboard, porque não posso realmente começar a arrastar um UIViewlugar, sempre tenho que começar com um UIViewController, o que não quero.

Se não houver uma maneira possível de fazer isso com um Storyboard, posso simplesmente fazer da maneira antiga, usando o Storyboard para minhas telas principais e segues, e usar um arquivo .xib separado para definir visualizações personalizadas?


Você deseja criar xibs para seus controladores de visualização separadamente e não no storyboard?
tipycalFlow

Você encontrou uma solução para isso?
aryaxt

@aryaxt: Estou usando uma mistura de Storyboard e xib's. Storyboard para as telas principais e xib's com apenas um UIView como raiz para visualizações complexas ou widgets. Portanto, não é realmente uma resposta à minha pergunta original (usando storyboard), mas basicamente fazendo o mesmo que já fazia antes.
znq

atualmente, basta usar uma visualização de contêiner , é realmente tão simples ... stackoverflow.com/questions/23399061/…
Fattie

Respostas:


189

Colocar o widget / visualização em um arquivo .xib separado funciona e é apropriado, especialmente se você quiser fazer referência a essa mesma visualização de vários controladores de visualização.

No entanto, às vezes você deseja ver a visualização / widget adicional dentro do mesmo storyboard, e isso é possível. Veja como você faz:

  1. Selecione seu controlador de visualização em IB (clique na barra preta abaixo da visualização) e arraste um UIView da Biblioteca de Objetos para a barra preta:

    insira a descrição da imagem aqui

  2. Quando uma visualização está na barra preta, ela é instanciada como qualquer outra visualização no IB, mas não é adicionada à sua hierarquia de visualização até que você faça isso no código. Altere a classe da visualização para corresponder à sua própria subclasse, se necessário:

    insira a descrição da imagem aqui

  3. Você pode conectá-lo ao seu controlador de visualização como faria com qualquer outra visualização: insira a descrição da imagem aqui

  4. A visualização adicionada é exibida no Esboço do documento e você também pode conectar ações e referências:

    insira a descrição da imagem aqui


Agora, o problema que permanece é que você não pode realmente ver a visualização, não importa quantas vezes você tente clicar ou clicar duas vezes, o que anularia todo o propósito de colocá-la no mesmo storyboard. Felizmente, eu conheço duas soluções alternativas.

A primeira solução alternativa é arrastar a visualização da barra preta de volta para a visualização do controlador de visualização, editá-la e arrastá-la de volta para a barra preta quando terminar. Isso é problemático, mas confiável.

A outra solução alternativa é mais complicada, mas eu prefiro porque ela me permite ver todas as minhas visualizações ao mesmo tempo:

  1. Arraste um UITableView da Biblioteca de Objetos para a visualização recém-adicionada.

  2. Em seguida, arraste um UITableViewCell para esse UITableView.

    insira a descrição da imagem aqui

  3. Depois de fazer isso, sua visualização aparece magicamente ao lado, mas você tem um UITableView que não deseja. Você pode redimensionar para 0 x 0 ou pode excluí-lo e seu UIView (geralmente) permanecerá visível.

  4. Ocasionalmente, a visualização secundária ficará oculta novamente no IB. Você pode repetir os passos acima se tiver excluído o UITableView ou se o UITableView ainda estiver na hierarquia, basta clicar em UITableViewCell e a visualização aparecerá novamente.

O segundo método funciona para UIViews, mas não tão bem para UIToolbars e é impossível para UIButtons, então a solução mais limpa que encontrei quando você precisa incluir muitas subvisualizações diferentes é anexar um único UIView secundário ao seu controlador de visualização como um contêiner que nunca é mostrado, coloque todas as suas visualizações secundárias lá e use o truque UITableViewCell para tornar tudo visível. Eu redimensiono meu UITableView fictício para 0x0 para torná-lo invisível. Aqui está uma captura de tela de como tudo fica junto:

insira a descrição da imagem aqui


Março de 2013, eu não precisava fazer isso - você deve ignorar a barra preta completamente e arrastar / soltar sua visualização diretamente na visualização principal e funciona bem (Xcode 4.5+)
Adam

É possível reutilizar esse uivew personalizado no mesmo ViewController - Se eu ex. precisava de dois uivews personalizados - E se for como?
Morten Gustafsson

2
Droga, eu prefiro apenas criar um xib separado. Provavelmente não me lembrarei de tudo isso quando tiver que atualizar o aplicativo em 6 meses.
Sandy

Embora esta seja uma resposta incrível, eu acidentalmente encontrei outra maneira melhor, eu acho. Ao conectar tomadas a componentes de vista reais. Se você passar o mouse um pouco sobre um componente dessa visualização interna, ele aparecerá para facilitar a seleção. Então você vê no storyboard ...
Oded Ben Dov

7
Embora esta seja uma resposta histórica incrivelmente admirável, agora está totalmente desatualizada. A Apple corrigiu todo o problema introduzindo "visualizações de contêiner", que agora são a coisa central e básica que você faz ao criar aplicativos - tudo uma "visualização de contêiner" o tempo todo. Graças a Deus, agora é muito fácil!
Fattie de

11

Se você está apenas procurando fazer seus controladores de visualização em outro lugar (e não em seu storyboard), há uma maneira bem simples de fazer isso:

1) Crie seus CustomViewControllers ( abcdControllerno código que experimentei) com seus xibs individuais como de costume.

2) Adicione um UIViewController(ou qualquer outra superclasse sua CustomViewController) ao storyboard.

3) Defina CustomClass como em CustomViewControllervez de UIViewControllerconforme mostrado aqui:

insira a descrição da imagem aqui

4) Finalmente, no seu viewDidLoad, carregue o custom xibe pronto.

- (void)viewDidLoad
{
    [super viewDidLoad];
    [[NSBundle mainBundle] loadNibNamed:@"abcdController" owner:self options:nil];
    // Do any additional setup after loading the view from its nib.
}

3
Obrigado por sua resposta detalhada, mas na verdade não estou procurando um controlador de visualização customizada, mas uma visualização customizada (um widget), que é adicionada a um UIViewController padrão. Portanto, o controlador de visualização não é o problema, mas eu queria saber qual é a melhor abordagem para criar widgets personalizados. Ou A) faça como eu fiz antes, com um arquivo .xib ou B) alguma outra abordagem que eu não conheço, ainda :-)
znq

1
Hmm ... Acho que consegui o que você queria. Basicamente, você deseja lidar com várias visualizações com o mesmo controlador, certo? Não consigo pensar em outra maneira senão loadNibNamednesse caso ... XO
tipycalFlow

Isso resolveu este problema para mim: stackoverflow.com/questions/11047991/… No entanto, em vez de viewDidLoad, usei loadView ...
Morkrom,

1
Só para repetir, tudo isso (graças a Deus!) Está totalmente desatualizado agora que as visualizações de contêiner estão aqui. Basta clicar em uma visualização de contêiner e pronto
Fattie,

1

Acho que você pode fazer algo assim para obter uma instância de viewcontroller específico do Storyboard e usar o view em cima dele.

ex:
MyViewController* myViewController = [[UIStoryboard storyboardWithName:@"Main"  bundle:nil] instantiateViewControllerWithIdentifier:@"myViewController"];
UIView* view = myViewController.view; //Get the view from your StoryBoard.

Espero que isto ajude

Obrigado Vijay

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.