2011-12-18 18 views
6

Tengo una vista de tabla con encabezados de sección personalizados. La vista para el encabezado de sección se define en el guión gráfico y se conecta a una variable de instancia. ¿Hay alguna manera de solicitar una nueva instancia de la vista desde el guión gráfico?reutilizar vista del guión gráfico

En el pasado he hecho esto por tener el encabezado de sección se define en su propio archivo xib y conseguir una nueva instancia mediante el uso de

[[NSBundle mainBundle] loadNibNamed:@"TimerViewSectionHeader" owner:self options:nil]; 
UIView *newHeaderView = self.sectionHeaderView; 

Respuesta

3

I 'No creo que haya una manera de hacer eso. La mejor apuesta es colocar la vista de encabezado personalizado de la vista de tabla en una punta separada y cargarla como lo hizo en la muestra de código cuando necesite usarla.

+0

+1 de mí. Pasé horas tratando de descubrir cómo hacer vistas de encabezado de tabla al estilo Storyboard porque pensé que Storyboard era la nueva y mejorada manera de diseñar la interfaz de usuario de mi aplicación. Desafortunadamente, el uso de Storyboard no funciona en este departamento y la mejor solución es volver a la forma anterior de cargar un plumín para la vista o crear la vista por código. Realmente quería creer que toda la interfaz de usuario de mi aplicación podría hacerse en un único archivo Storyboard, pero definitivamente este no es el caso. – ozz

0

He podido reutilizar una vista en el guión gráfico simplemente conectando una transición de una tabla vista a la que quiero reutilizar.

por lo que mi tabla de vista que quiero volver a utilizar se apunta dos veces. Funciona de cierta forma, pero el problema que me está surgiendo es establecer una variable (usando instantiateViewControllerWithIdentifier) ​​en mi aplicación, delegar en mi vista de tabla que se está reutilizando. Parece que si lo vuelvo a utilizar, el guión gráfico está creando 2 instancias de mi tabla vista y la que obtengo con instantiateViewControllerWithIdentifier no es la que quiero.

No estoy seguro si esta es la forma correcta de hacerlo. Pero supongo que muchos otros están haciendo esto de alguna manera. Con las celdas de tabla personalizadas en el guión gráfico, sospecho que mucha gente quiere reutilizar sus puntos de vista.

3

Traté de hacer lo mismo y me encontré con el mismo problema.

Me gusta mucho trabajar con guiones gráficos y me impresionó lo rápido que pude crear una interfaz de usuario funcional. Sin embargo, tan pronto como necesite volver a utilizar las vistas, tiene mucho sentido colocarlas en una punta separada junto con su subclase UIViewController.

A continuación, puede colocar un genérico UIView en todos los lugares donde su reutilizada vista debe ir y añadir la vista utilizando su ViewController:

[myReusableViewController loadView]; 
[myReusableViewController viewDidLoad]; // You have to handle view callbacks yourself. 

[self.myReusableViewPlaceholder addSubview:myResusableViewController.view]; 
[myReusableViewController viewWillAppear:YES]; 

Así que para resumir:

  • Use storyboard, es genial
  • Cree el andamio de su aplicación en el guión gráfico, junto con cualquier vista estática (como pantallas Acerca de etc.)
  • Cree vistas reutilizadas en una subclase personalizada nib + UIViewController y agregue marcadores de posición UIView en su guión gráfico.

En otra respuesta pensé en algunos Pros and Cons of Storyboard

+0

¿está seguro de que tiene que llamar a los callbacks usted mismo? Eso me parece extraño – Rhubarb

+0

, sin embargo, +1 por la idea de utilizar un UIView como marcador de posición. Tenga en cuenta que puede combinar esto con la respuesta anterior de Krejko, y en lugar de cargar el controlador desde una punta, cárguelo de un guión gráfico (puede usar un guión gráfico para guardar varias vistas) – Rhubarb

+0

@Rubarb No estoy 100% seguro de que tiene que hacer las retrollamadas usted mismo, pero si incorpora la vista, entonces usted es responsable de llamarlo, al parecer. Tenga en cuenta que en iOS6.0 hay un nuevo mecanismo para incrustar un ViewController completo en un área de su controlador de vista actual usando Embed Segue. Esta podría ser una opción también. – Besi

3

La solución que he llegado con de esto es como sigue:

Tengo un tableview con varias celdas prototipo que muestra los datos complejos. Hay una transición a una vista de detalle y una vista de proceso de transacción.

Esta primera tabla tiene un botón de búsqueda que muestra una nueva tabla con los resultados.Necesita la misma funcionalidad que la tabla principal que lo empuja; incluidos los cambios en el detalle y las vistas de progreso de la transacción, así:

En el guión gráfico, seleccione y copie su tabla de vista principal. Deselecciona y pega. Cree una transición de inserción desde su tabla principal a su segunda tabla; o desde donde quiera navegar desde él. Modifique la segunda tabla como quiera. IE: si requiere algunos cambios de UI, no hay problema.

Crea una nueva clase viewcontroller que es una subclase del viewcontroller que ejecuta la tabla principal.

Anule el delegado de datos en su subclase para servir el subconjunto de datos que desea.

De vuelta en el guión gráfico, seleccione su segundo controlador de tabla de vista y en el inspector de identidad seleccione su subclase como la clase personalizada.

Para que esta solución funcione sin problemas, su aplicación realmente necesita administrar datos para las vistas. Podría usar prepareforsegue para pasar datos de la primera vista de tabla a la segunda, pero he encontrado que el modelo de datos de la aplicación es mucho más flexible desde numerosos puntos de vista.

A menos que tenga botones que presionen las vistas secundarias a través de segue, su subclase deberá anular las funciones que presionen mediante segues con identidades. NB Segues debe tener identificadores únicos si los identifica en absoluto.

Tomó un montón de prueba y error para resolver esto, pero una vez que entiendes el concepto, es una solución relativamente suave que es bastante adaptable y no tan mala para implementar.

3

No estoy seguro acerca de solo las vistas, pero la forma en que pude ver los controladores de vista fuera de mi guión gráfico es la siguiente.

UIViewController *viewController = [self.storyboard instantiateViewControllerWithIdentifier:@"IdentifierName"]; 

A partir de aquí, tal vez usted podría ser capaz de utilizar esta forma similar a cómo se ha hecho una vez con puntas.

+0

Esto debería marcarse como la respuesta correcta – Yariv

Cuestiones relacionadas