Atualização 1/12/2016 : é 2016 e ainda prefiro definir minhas interfaces de usuário no código e não no Storyboards. Dito isto, os Storyboards percorreram um longo caminho. Eu removi todos os pontos deste post que simplesmente não se aplicam mais em 2016.
Atualização 24/04/2015 : Curiosamente, a Apple nem usa Storyboards em seu ResearchKit de código aberto recentemente, como Peter Steinberger notou (no subtítulo "Interface Builder").
Atualização 6/10/2014 : Como esperado, a Apple continua aprimorando o Storyboards e o Xcode. Alguns dos pontos aplicados ao iOS 7 e abaixo não se aplicam mais ao iOS 8 (e agora estão marcados como tal). Portanto, embora os Storyboards ainda tenham falhas, eu reviso meus conselhos de não usar para usar seletivamente onde faz sentido .
Mesmo agora que o iOS 9 está pronto, eu recomendaria contratenha cuidado ao decidir usar Storyboards. Aqui estão as minhas razões:
Os storyboards falham no tempo de execução, não no tempo de compilação : você possui um erro de digitação no nome de um segue ou o conectou errado no seu storyboard? Ele explodirá em tempo de execução. Você usa uma subclasse UIViewController personalizada que não existe mais no seu storyboard? Ele explodirá em tempo de execução. Se você fizer essas coisas no código, as capturará desde o início, durante o tempo de compilação. Atualização : Minha nova ferramenta StoryboardLint resolve principalmente esse problema.
Os storyboards ficam confusos rapidamente : à medida que seu projeto cresce, seu storyboard se torna cada vez mais difícil de navegar. Além disso, se vários controladores de visualização tiverem várias sequências para vários outros controladores de visualização, seu storyboard rapidamente começará a parecer uma tigela de espaguete e você se aproximará e afastará o zoom e rolar por todo o local para encontrar o controlador de visualização que está procurando para e descobrir o que segue aponta onde. Atualização : Esse problema pode ser resolvido principalmente dividindo seu Storyboard em vários Storyboards, conforme descrito neste artigo por Pilky e neste artigo por Robert Brown .
Os storyboards tornam o trabalho em equipe mais difícil : como você geralmente possui apenas um arquivo de storyboard enorme para o seu projeto, ter vários desenvolvedores regularmente fazendo alterações nesse arquivo pode ser uma dor de cabeça: as alterações precisam ser mescladas e os conflitos resolvidos. Quando ocorre um conflito, é difícil saber como resolvê-lo: o Xcode gera o arquivo XML do storyboard e ele não foi realmente projetado com o objetivo de que um ser humano precisaria ler e muito menos editá-lo.
Os storyboards tornam as revisões de código difíceis ou quase impossíveis : as revisões de código por pares são uma ótima coisa para fazer em sua equipe. No entanto, quando você faz alterações em um storyboard, é quase impossível revisar essas alterações com um desenvolvedor diferente. Tudo o que você pode obter é uma comparação de um enorme arquivo XML. Decifrar o que realmente mudou e se essas mudanças estão corretas ou se quebraram algo é realmente difícil.
Os storyboards dificultam a reutilização do código : nos meus projetos para iOS, geralmente crio uma classe que contém todas as cores, fontes, margens e inserções que uso em todo o aplicativo para proporcionar uma aparência e sensação consistentes: é necessário alterar uma linha se necessário. ajuste qualquer um desses valores para todo o aplicativo. Se você definir esses valores no storyboard, você os duplicará e precisará encontrar todas as ocorrências quando quiser alterá-los. Há grandes chances de você perder uma, porque não há pesquisa e substituição nos storyboards.
Os storyboards exigem alternância constante de contexto : eu me pego trabalhando e navegando muito mais rápido no código do que nos storyboards. Quando seu aplicativo usa storyboards, você muda constantemente de contexto: "Oh, eu quero que uma torneira nesta célula de exibição de tabela carregue um controlador de exibição diferente. Agora, tenho que abrir o storyboard, encontrar o controlador de exibição correto, criar um novo segue para o outro controlador de exibição (que eu também tenho que encontrar), dê um nome às segue, lembre-se desse nome (não posso usar constantes ou variáveis nos storyboards), volte ao código e espero não digitar o nome de isso segue para o meu método prepareForSegue. Como eu gostaria de poder digitar essas 3 linhas de código aqui onde estou! " Não, não é divertido. A alternância entre código e storyboard (e entre teclado e mouse) envelhece rapidamente e o torna mais lento.
Os storyboards são difíceis de refatorar : quando você refatorar seu código, verifique se ele ainda corresponde ao que o storyboard espera. Quando você move as coisas no seu storyboard, você só descobrirá em tempo de execução se ele ainda funcionar com o seu código. Parece-me que tenho que manter dois mundos sincronizados. Parece frágil e desencoraja mudanças na minha humilde opinião.
Os storyboards são menos flexíveis : no código, você pode basicamente fazer o que quiser! Com os storyboards, você está limitado a um subconjunto do que você pode fazer no código. Especialmente quando você quer fazer coisas avançadas com animações e transições, você se encontrará "lutando contra o storyboard" para fazê-lo funcionar.
Os storyboards não permitem alterar o tipo de controladores de exibição especiais : você deseja alterar um UITableViewController
para um UICollectionViewController
? Ou em uma planície UIViewController
? Não é possível em um storyboard. Você precisa excluir o antigo controlador de exibição, criar um novo e reconectar todos os seguintes. É muito mais fácil fazer essa alteração no código.
Os storyboards adicionam dois passivos extras ao seu projeto : (1) A ferramenta Editor de storyboard que gera o XML do storyboard e (2) o componente de tempo de execução que analisa o XML e cria objetos de interface do usuário e controlador a partir dele. Ambas as partes podem ter bugs que você não pode consertar.
Os storyboards não permitem adicionar uma subvisão aUIImageView
: Quem sabe o porquê.
Os storyboards não permitem ativar o Layout automático para exibições individuais (controladores) : Ao marcar / desmarcar a opção Layout automático em um Storyboard, a alteração é aplicada a TODOS os controladores no Storyboard. (Obrigado a Sava Mazăre por este ponto!)
Os storyboards têm um risco maior de quebrar a compatibilidade com as versões anteriores : o Xcode às vezes altera o formato do arquivo do Storyboard e não garante de forma alguma que você possa abrir os arquivos do Storyboard criados hoje em alguns anos ou meses. (Agradecemos aos pensamentos avançados sobre este ponto. Veja o comentário original )
Os storyboards podem tornar seu código mais complexo : quando você cria seus controladores de exibição no código, pode criar init
métodos personalizados , por exemplo initWithCustomer:
. Dessa forma, você pode tornar customer
imutável a parte interna do seu controlador de exibição e garantir que ele não possa ser criado sem um customer
objeto. Isso não é possível ao usar Storyboards. Você terá que aguardar a prepareForSegue:sender:
chamada do método e, em seguida, definir a customer
propriedade no seu controlador de exibição, o que significa que você deve tornar essa propriedade mutável e permitir que o controlador de exibição seja criado sem um customer
objeto . Na minha experiência, isso pode complicar bastante o seu código e dificulta o raciocínio sobre o fluxo do seu aplicativo. Atualização 9/9/16: Chris Dzombak escreveu um ótimo artigo sobre esse problema .
É o McDonald's : Para dizer isso nas palavras de Steve Jobs sobre a Microsoft: É o McDonald's (vídeo) !
Essas são as minhas razões pelas quais eu realmente não gosto de trabalhar com storyboards. Alguns desses motivos também se aplicam aos XIBs. Nos projetos baseados em storyboard nos quais trabalhei, eles me custaram muito mais tempo do que economizaram e tornaram as coisas mais complicadas, em vez de mais fáceis.
Quando crio minha interface do usuário e o fluxo do aplicativo no código, tenho muito mais controle sobre o que está acontecendo, é mais fácil depurar, é mais fácil detectar erros desde o início, é mais fácil explicar minhas alterações para outros desenvolvedores e é mais fácil oferecer suporte ao iPhone e iPad.
No entanto, concordo que o layout de toda a interface do usuário no código pode não ser uma solução única para todos os projetos. Se a interface do usuário do iPad diferir muito da interface do iPhone em determinados lugares, pode fazer sentido criar um XIB apenas para essas áreas.
Muitos dos problemas descritos acima podem ser corrigidos pela Apple e espero que seja isso que eles farão.
Apenas meus dois centavos.
Atualização : No Xcode 5, a Apple retirou a opção de criar um projeto sem um Storyboard. Eu escrevi um pequeno script que porta os modelos do Xcode 4 (com a opção Storyboard-opt-out) para o Xcode 5: https://github.com/jfahrenkrug/Xcode4templates