2011-02-02 12 views
11

Estoy tratando de organizar todo y crear una jerarquía de vistas para mi aplicación. Entonces, por ejemplo, quiero crear una vista personalizada para mostrar texto, otra vista personalizada para mostrar el progreso y luego usar todas esas vistas en la vista principal creada con Plantilla de aplicación basada en vista.UIView personalizado desde el Creador de interfaces

sé cómo crear mediante programación que - se crea UIView subclase, implementar el método drawRect, colocar un vacío UIView en Interface Builder y el azar es Clase a mi clase personalizada. Mi problema es que quiero crear esas vistas personalizadas en Interface Builder en lugar de programáticamente.

Hasta ahora hemos creado UIViewController controlador con el archivo XI ter y en viewDidLoad método de vista del controlador de la plantilla que crear esa instancia del controlador vista personalizada y añadir que es vista como una vista secundaria de ese vacío UIView añadido en Interface Builder (lo mismo cambiaría la Clase en el enfoque programático).

Funciona, pero es más un truco para mí y es difícil para mí creer que no hay un mejor método donde podría agregar esas vistas personalizadas en el constructor de interfaz sin tener que implementar el método viewDidLoad y crear controladores y agregue sus puntos de vista dentro de ese método.

Respuesta

0

Quizás no te entendí?
tiene biblioteca en el constructor de interfaz puede mover cada componente que desee y colocarlo en su vista. (Puede agregar otra vista al agregar UIView y cambiar su nombre de clase en la cuarta pestaña).
luego declaras vars con IBOutlet y los conectas desde la segunda pestaña de los propietarios del archivo ur a sus componentes ... ¿otra pregunta?

+0

Hmm .. Digamos que tengo 4 XIB en mi proyecto - 2 XIB de plantillas de aplicaciones basadas en la vista "estándar": MainWindows.xib y TestViewController.xib. Ahora, para mantener las cosas limpias, quiero crear 2 vistas adicionales: cada vista en otro XIB: CustomTextView.xib y CustomProgressView.xib. Añado UILabel y UIButton al primero y UILabel UIProgressView al segundo. Ahora quiero agregar esas dos vistas personalizadas a mi vista TestViewController.xib. ¿Cómo hago eso (aparte de una forma en que lo hice y usando el diseño XIB no la subclase UIView dibujando todo en drawRect)? – shw

+0

ok, creo que te tengo. Si CustomTextView y CustomProgressView son vistas o lo amplían, debes agregar UIView a tu vista principal, por ejemplo, mainWindow, y en el inspector de identidad (la cuarta pestaña en el inspector) deberías cambiar de UIView. a tu clase (CustomProgressView por ejemplo). – Ratinho

+0

Ok, pero para eso tengo que crear una clase que sea una subclase de UIView; de lo contrario, CustomTextView no estará visible en el campo Clase. Si lo hago, ¿cómo lo "conecto" con el archivo CustomTextView.xib que creé? Me las arreglé para anular el método initWithCoder, cargar ese xib usando el método '[NSBundle loadNibNamed]' y agregar la primera vista que regresa como una subvista de esa subclase UIView pero todavía se siente como piratería y como debería haber una mejor manera de hacerlo. – shw

1

Para que esto funcione, debe crear un plug-in para Interface Builder que use la clase de su control personalizado. Tan pronto como cree e instale su complemento, podrá agregar, arrastrando y soltando, instancias de su vista a otra ventana o vista en Interface Builder. Para obtener información sobre cómo crear complementos de IB, consulte el Interface Builder Plug-In Programming Guide y el capítulo sobre cómo crear sus propios controles de paleta IB en el libro de Aaron Hillegass, Cocoa Programming for Mac OS X.

Here es el enlace al autor original de la respuesta aceptada al a similar question.

0

Desafortunadamente, no puede hacer lo que quiere hacer con UIKit. Los complementos de IB solo funcionan para OS X, y Apple explícitamente no permite su uso con el desarrollo de iOS. Algo que ver con ellos no son bibliotecas estáticas. Quién sabe, pueden cambiar esto algún día, pero no aguantaría la respiración.

1

Esto fue originalmente un comentario en el hilo de Ratinho, pero creció demasiado.

Aunque mi propia experiencia concuerda con todo lo mencionado aquí y arriba, hay algunas cosas que pueden aliviar su dolor, o al menos hacer que las cosas se sientan un poco menos hack-ish.

Derive todas sus clases UIView personalizadas de una clase común, por ejemplo EmbeddableView. Envuelva toda la lógica de initWithCoder en esta clase base, utilizando la identidad de Clase (o un método que se puede cargar) para determinar desde qué NIB se inicializará. Esto sigue siendo un truco, pero al menos formalizas las reglas de interfaz y ocultas la maquinaria.

Además, puede mejorar aún más su experiencia de Interface Builder al usar clases de "microcontroladores" que combinan con sus vistas personalizadas para manejar sus métodos de delegado/acción y cerrar la brecha con el UIViewController principal a través de su propio protocolo de delegación. Todo esto se puede conectar entre sí utilizando conectores dentro de Interface Builder.

El UIViewController subyacente solo necesita implementar suficiente funcionalidad para satisfacer el patrón de delegación "microcontrolador".

Ya tiene los detalles para agregar las vistas personalizadas cambiando el nombre de la clase y manejando la carga de la punta. Los "microcontroladores" (si se usan) solo pueden ser clases derivadas de NSObject added to the NIB as suggested here.

Aunque he realizado todos estos pasos en casos aislados, nunca me he tomado todo el camino hacia este tipo de solución formal, pero con cierta planificación debería ser bastante confiable y robusta.

Cuestiones relacionadas