Introducci贸n

1

Lo que aprender谩s sobre el desarrollo de interfaces con iOS

2

Instalacion de Xcode desde 0

Introducci贸n a Xcode

3

Primer Proyecto

4

Navigation Area

5

Editor, Util Area y Tool Bar

6

Targets y Target Tabs

Formas de crear vistas

7

Organizacion de Carpetas

8

Storyboards vs Xibs vs Codigo

9

Splash Screen

10

Completando nuestro Splash Screen

UIView Components

11

TabBar Controller y Mejores Pr谩cticas

12

Storyboard Reference

13

Explicaci贸n breve de algunos elementos gr谩ficos

14

Crear nuestra primera interfaz gr谩fica

15

Diferentes componentes y formas de autolayout

16

Agregando el resto de nuestros componentes usando constraints

Agregando Estilo a UIView Components

17

Agregando un icono a nuestra app

18

Custom colors

19

Agregando iconos a nuestros botones

20

Key paths de redondeo y sombra

21

Custom fonts

22

Scroll view controller

Tipos de vistas y manejo

23

OnBoarding View

24

Container ViewController

25

Container ViewController con c贸digo

26

ContainerViews

Adaptaci贸n de vistas

27

Tablas

28

Dise帽o de celdas

Completando nuestras vistas

29

C贸digo para las tablas

30

Tama帽os dinamicos para las celdas

31

EmptyState usando c贸digo

32

Agregar estilos a nuestro navigation view

33

Agregando estilos a nuestro Tab bar

34

Custom Tab bar button

35

Budget view

36

Iniciando el header de animacion

37

Animaci贸n de barra superior en las tablas usando constraints

38

Stats

Conclusiones

39

Reto final

40

Conclusiones

Bonus: Lottie

41

Gesti贸n de dependencias

42

Instalaci贸n dependencias con Cocoapods

43

Instalaci贸n dependencias con Carthage

44

Cocoapods vs Carthage

45

Crear nuestro lottie file

A煤n no tienes acceso a esta clase

Crea una cuenta y contin煤a viendo este curso

ContainerViews

26/45
Recursos

Los Container View Controllers son una de las mejores formas de refactorizar vistas y crear funciones 煤nicas en ellas.
El reto de esta clase consiste en que arregles los problemas que est谩n teniendo los constraints.

Aportes 17

Preguntas 3

Ordenar por:

驴Quieres ver m谩s aportes, preguntas y respuestas de la comunidad? Crea una cuenta o inicia sesi贸n.

No estas mostrando que el updateContainerView debia ser llamado en el viewDidLoad, de no revisar el source hubiese seguido perdido.

-.- le falto esa linea de c贸digo, por eso no funcionaba.

solo escribe c贸digo y uno tiene que imaginar el por que lo hace de todos los cursos de este es el peor, no dudo de las capacidades del tipo, pero en cuestion ense帽anza le fata mucho.

Les dejo estos atajos del teclado espero les funcionen.

Interfaz de usuario: que son todos aquellos atajos que nos permiten navegar por las diferentes interfaces de usuario de Xcode, pudiendo mostrar u ocultar zonas del entorno de desarrollo seg煤n necesitemos.
Ciclo de vida de la app: que nos permiten compilar, ejecutar en el simulador o dispositivo, detener la ejecuci贸n y otras opciones.
Vista de c贸digo: son atajos para utilizar dentro del editor de c贸digo.
Generales : son aquellos de car谩cter general y que probablemente vamos a utilizar en m煤ltiples ocasiones.
Interfaz de usuario
Vamos a comenzar con la barra izquierda de la pantalla o Navigation Area. Utilizando los siguientes atajos podemos ocultar, o mostrar todas y cada una de las diferentes pesta帽as:

鈱 + 0: mostrar / ocultar la barra lateral
鈱 + N: selecciona la pesta帽a n煤mero N
Por otro lado, podemos hacer lo mismo pero con la barra derecha de la pantalla o Utilities Area:

鈱 + 鈱 + 0: mostrar / ocultar la barra lateral
鈱 + 鈱 + N: selecciona la pesta帽a n煤mero N
Finalmente, si lo que queremos es mostrar / ocultar la barra de la consola, lo haremos con el atajo 鈱 + 鈬 + Y.

Otro atajo muy interesante es el que nos permite abrir el Assistant Editor cuando tenemos seleccionado un Storyboard por ejemplo. Para abrir la vista 煤nicamente haremos 鈱 + 鈱 + 鈫. Si queremos volver a cerrar el asistente, lo haremos con 鈱 + 鈫.

Ciclo de vida de la app
Si en cualquier momento queremos compilar nuestra app, lo haremos utilizando el atajo 鈱 + B.

Cuando lo que necesitemos sea ejecutar la app en el simulador / dispositivo, podremos utilizar el atajo 鈱 + R. Esta acci贸n compila y despliega la app en el dispositivo o simulador seleccionado.

Para detener la ejecuci贸n de la app, podemos hacerlo mediante 鈱 + . si el foco esta en Xcode, o con 鈱 + Qsi el foco lo tiene el simulador (que b谩sicamente cierra la app de simulador y detiene por tanto la ejecuci贸n).

Vista de c贸digo
Si queremos comentar un bloque de c贸digo seleccionado, lo podemos hacer pulsando 鈱 + 鈬 + 7.

Si estamos encima del nombre de un m茅todo o clase, podemos ir directamente a su definici贸n pulsando el atajo 鈱 + 鈱 + J. Si luego queremos volver a donde est谩bamos, podemos hacerlo mediante 鈱 + 鈱 + 鈫.

Cuando vuestro c贸digo haya perdido su correcta indentaci贸n, ten茅is un atajo que os permite indentarlo correctamente, seleccionando dicho bloque de c贸digo y pulsando el atajo 鈱 + i.

Generales
Quiz谩s uno de los atajos mas productivos de todos es el Quick Open, que nos permite abrir cualquier archivo de nuestro proyecto mediante un muy sencillo buscador. Pod茅is abrir el Quick Open mediante el atajo 鈱 + 鈬 + O.

Este Quick Open no solo permite abrir archivos, sino que tambi茅n podemos poner el nombre de un m茅todo o propiedad y nos llevar谩 a dicho lugar en el c贸digo.

Si queremos abrir las Preferencias de Xcode, lo podemos hacer pulsando 鈱 + , siendo este atajo, aplicable a todas las aplicaciones de MacOS.

Conclusi贸n
Los atajos de teclado son algo muy importante cuando te tomas en serio la productividad, y es que si sumamos todos los micro-momentos que dedicamos cambiando entre teclado y rat贸n, os aseguro que os dar谩 una cuantiosa suma a lo largo del d铆a.

Os recomiendo que le deis una oportunidad a estos atajos que os hemos tra铆do, y que investigu茅is otros muchos, que incluso pod茅is configurar, para ir descubriendo m谩s y m谩s opciones interesantes.

Se demuestra el manejo de la materia. Pero en general el curso falla por su enfoque pedag贸gico.
Hay que limitarse a copiar los pasos e imaginarse los porqu茅s.

Espero que en las pr贸ximas clases se entienda mejor, me quedaron muchas dudas con estas 煤ltimas 2 clases, ya me toca aprender en otro lado.

le faltan varias cosas al curso, creo esta cortando detalles en la edici贸n de video y es necesario otro curso actualizado pero con otro profesor, el ya no

'index(of:)  is deprecated now.  We should use `firstIndex(of:)` instead

Uff Lo que costo

Me quedaba en blanco la imagen, title y description, aunque estaban bien linkeados, solo se ve铆a el bot贸n, as铆 que cerr茅 Xcode, descargue los 4 archivos y abr铆 nuevamente y listo

En mi caso fu茅 necesario modificar un poco la extensi贸n del DataSource:

func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? {
        let index = contentViewController.firstIndex(of: viewController)
        if index == 0 {
            return nil
        }
        return contentViewController[index ?? 0 + 1]
    }

De lo contrario la aplicaci贸n se cerraba, por el 铆ndice fuera de rango鈥

Hola chicos. Cuando corro la app me sale el siguiente error:

2018-12-01 14:27:41.327565-0500 PlatziFinanzas[2356:639386] Failed to set (borderUIColor) user defined inspected property on (UIButton): [<UIButton 0x7ff44fc0ebf0> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key borderUIColor.
2018-12-01 14:27:41.338425-0500 PlatziFinanzas[2356:639386] *** Terminating app due to uncaught exception 'NSUnknownKeyException', reason: '[<PlatziFinanzas.OnBoardingContainerViewController 0x7ff44ff1b1c0> setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key pageController.'
*** First throw call stack:
(
	0   CoreFoundation                      0x00000001139c81bb __exceptionPreprocess + 331
	1   libobjc.A.dylib                     0x000000010f866735 objc_exception_throw + 48
	2   CoreFoundation                      0x00000001139c7d29 -[NSException raise] + 9
	3   Foundation                          0x000000010f291de4 -[NSObject(NSKeyValueCoding) setValue:forKey:] + 292
	4   UIKitCore                           0x000000011db4a292 -[UIViewController setValue:forKey:] + 87
	5   UIKitCore                           0x000000011dde1573 -[UIRuntimeOutletConnection connect] + 109
	6   CoreFoundation                      0x00000001139b3cfd -[NSArray makeObjectsPerformSelector:] + 317
	7   UIKitCore                           0x000000011ddde2b9 -[UINib instantiateWithOwner:options:] + 1814
	8   UIKitCore                           0x000000011db51452 -[UIViewController _loadViewFromNibNamed:bundle:] + 383
	9   UIKitCore                           0x000000011db51ddc -[UIViewController loadView] + 177
	10  UIKitCore                           0x000000011db520ee -[UIViewController loadViewIfRequired] + 175
	11  UIKitCore                           0x000000011db52940 -[UIViewController view] + 27
	12  UIKitCore                           0x000000011e1a9c53 -[UIWindow addRootViewControllerViewIfPossible] + 122
	13  UIKitCore                           0x000000011e1aa36e -[UIWindow _setHidden:forced:] + 294
	14  UIKitCore                           0x000000011e1bd5c0 -[UIWindow makeKeyAndVisible] + 42
	15  UIKitCore                           0x000000011e16a833 -[UIApplication _callInitializationDelegatesForMainScene:transitionContext:] + 4595
	16  UIKitCore                           0x000000011e16fc2f -[UIApplication _runWithMainScene:transitionContext:completion:] + 1623
	17  UIKitCore                           0x000000011d98e4e9 __111-[__UICanvasLifecycleMonitor_Compatability _scheduleFirstCommitForScene:transition:firstActivation:completion:]_block_invoke + 866
	18  UIKitCore                           0x000000011d99729c +[_UICanvas _enqueuePostSettingUpdateTransactionBlock:] + 153
	19  UIKitCore                           0x000000011d98e126 -[__UICanvasLifecycleMonitor_Compatability _scheduleFirstCommitForScene:transition:firstActivation:completion:] + 233
	20  UIKitCore                           0x000000011d98eae0 -[__UICanvasLifecycleMonitor_Compatability activateEventsOnly:withContext:completion:] + 1085
	21  UIKitCore                           0x000000011d98ccb5 __82-[_UIApplicationCanvas _transitionLifecycleStateWithTransitionContext:completion:]_block_invoke + 795
	22  UIKitCore                           0x000000011d98c95f -[_UIApplicationCanvas _transitionLifecycleStateWithTransitionContext:completion:] + 435
	23  UIKitCore                           0x000000011d991a90 __125-[_UICanvasLifecycleSettingsDiffAction performActionsForCanvas:withUpdatedScene:settingsDiff:fromSettings:transitionContext:]_block_invoke + 584
	24  UIKitCore                           0x000000011d99280e _performActionsWithDelayForTransitionContext + 100
	25  UIKitCore                           0x000000011d9917ef -[_UICanvasLifecycleSettingsDiffAction performActionsForCanvas:withUpdatedScene:settingsDiff:fromSettings:transitionContext:] + 221
	26  UIKitCore                           0x000000011d99693a -[_UICanvas scene:didUpdateWithDiff:transitionContext:completion:] + 392
	27  UIKitCore                           0x000000011e16e44e -[UIApplication workspace:didCreateScene:withTransitionContext:completion:] + 515
	28  UIKitCore                           0x000000011dd12d09 -[UIApplicationSceneClientAgent scene:didInitializeWithEvent:completion:] + 357
	29  FrontBoardServices                  0x00000001178b72da -[FBSSceneImpl _didCreateWithTransitionContext:completion:] + 448
	30  FrontBoardServices                  0x00000001178c2443 __56-[FBSWorkspace client:handleCreateScene:withCompletion:]_block_invoke_2 + 271
	31  FrontBoardServices                  0x00000001178c1b3a __40-[FBSWorkspace _performDelegateCallOut:]_block_invoke + 53
	32  libdispatch.dylib                   0x000000011748d602 _dispatch_client_callout + 8
	33  libdispatch.dylib                   0x0000000117490b78 _dispatch_block_invoke_direct + 301
	34  FrontBoardServices                  0x00000001178f6ba8 __FBSSERIALQUEUE_IS_CALLING_OUT_TO_A_BLOCK__ + 30
	35  FrontBoardServices                  0x00000001178f6860 -[FBSSerialQueue _performNext] + 457
	36  FrontBoardServices                  0x00000001178f6e40 -[FBSSerialQueue _performNextFromRunLoopSource] + 45
	37  CoreFoundation                      0x000000011392d721 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 17
	38  CoreFoundation                      0x000000011392cf93 __CFRunLoopDoSources0 + 243
	39  CoreFoundation                      0x000000011392763f __CFRunLoopRun + 1263
	40  CoreFoundation                      0x0000000113926e11 CFRunLoopRunSpecific + 625
	41  GraphicsServices                    0x00000001104db1dd GSEventRunModal + 62
	42  UIKitCore                           0x000000011e17181d UIApplicationMain + 140
	43  PlatziFinanzas                      0x000000010ea96677 main + 71
	44  libdyld.dylib                       0x0000000117503575 start + 1
	45  ???                                 0x0000000000000001 0x0 + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException```Por qu茅 ocurre si el c贸digo de borde funcionaba?

Ah... y cuando la corr铆 la primera vez me crea una nueva app... Ahora tengo dos. 驴Por qu茅 sucede esto?

Hola Andr茅s, me perd铆 en este punto ya que al compilar la aplicaci贸n, veo que ya est谩n las im谩genes, pero no recuerdo en qu茅 punto se agregan. Creo que he seguido juiciosamente los videos pero ya en este, est谩n las im谩genes, en la App que tengo todo parece estar bien pero no recuerdo en qu茅 video se agregaron las im谩genes鈥 depronto falta alg煤n video intermedio?

Redundant conformance of 鈥極nBoardingViewController鈥 to protocol 鈥楿IPageViewControllerDelegate鈥

a mi me salto este error

De verdad que para personas sin experiencia en programacion o inclusive al menos conocimientos basicos de iOS, tomar esta carrera ha de ser super complejo

Hola si quisiera que esta pantalla solo se mostrase una unica vez como lo har铆a ??

Para los que estan viendo esta parte del curso y ya no les aparace la funcion pageController(transition completed) aqui esta:

extension OnBoardingViewController: UIPageViewControllerDelegate {
    func pageViewController(_ pageViewController: UIPageViewController, didFinishAnimating finished: Bool, previousViewControllers: [UIViewController], transitionCompleted completed: Bool) {
        
        guard let index = contentViewController.index(of: viewControllers!.first!) else {
            return
        }
        
        PageControl?.currentPage = index
    }
}