2011-04-08 22 views
8

Quiero agregar una vista de uiviewcontroller que tiene un botón y algunas etiquetas como vista de contenido de uitableviewcell.Cómo agregar la vista de uiviewcontroller como vista de contenido a uitableviewcell?

Aunque puedo agregar pero la acción del botón causa un bloqueo.

MyViewController *controller = [[MyViewController alloc] initwithnibname:@"MyView" bundle:nil]; 
[cell.contentview addsubview:controller.view]; 
[controller release]; // if i comment out this part the button action is received by my view controller. 

Sin embargo, hay pérdidas de memoria cuando se quita de la vista. El dealloc de myviewcontroller no se llama.

¿Cuál es la forma correcta de hacerlo?

  1. Añadir miras a una célula UITableView que tiene un botón y es manejado por el viewcontroller

  2. ¿Cómo asegurar la memoria se libera cuando la vista se sale del ámbito?

TIA, Praveen

+0

publicar algunos de registro de bloqueo. Revisa tu consola para eso. –

Respuesta

1

creo que el problema es que usted está liberando el controlador y sólo usar la subvista que es retenida por su supervista. El patrón de acción necesita un objetivo que supongo que es el controlador liberado. ¿Y por qué deberías liberar tu viewController si solo necesitas verlo? Consérvelo y guarda una referencia a través de una propiedad.

Mi forma de agregar subvistas a una celda de tabla sería en una subclase de UITableViewCell. Supongamos que tiene una subclase de UITableViewCell, digamos ButtonTableViewCell. El init de the cell crea y agrega un UIButton a su celda y lo pone muy bien en su contentView. Califica una propiedad que hace referencia al botón. Me gusta UIButton *myButton. Lo que debe hacerse en el cellForRowAtIndexPath es algo como esto:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    ButtonTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"MyButtonCell"];   
    if (cell == nil) { 
     cell = [[ButtonTableViewCell alloc] initWithReuseIdentifier:@"MyButtonCell"]; 
    } 
    [cell.myButton addTarget:self action:@selector(onDoSomething) forControlEvents:UIControlEventTouchUpInside]; 

    // Do more cell configuration... 
    return cell; 
} 

que he hecho hasta el inicializador initWithReuseIdentifier que se puede implementar fácilmente.

Asegura la liberación de memoria con el método viewDidUnload del UIViewController y el método dealloc.

+0

La acción del botón en la uiview se invoca solo si no se suelta el controlador. ¿Cómo puede el controlador obtener el evento de clic de botón si tengo que tener una administración de memoria eficiente? –

+0

¿Quién dice que liberar el controlador es un uso eficiente de la memoria si lo necesita? El controlador actual recibirá una advertencia de memoria si se queda sin memoria. Esto disparará la descarga de vistas. –

+0

No estoy liberando el controlador. Pero quiero que se llame al controlador (IBAction) y también cuando se desasigna la vista de tabla, se llama al dealloc del controlador. No se llama en mi caso. –

1

"acción del botón provoca un bloqueo" - ¿Qué es el bloqueo cuando toca el botón?

Además, solo parece estar utilizando la vista de MyViewController (ya que agrega la vista a la celda y luego suelta el controlador): ¿qué se supone que debe hacer este controlador aparte de contener una vista? ¿Por qué no usar solo una vista?

Además, (supongo salvaje aquí) el constructor habitual de un botón no tiene nuevo/alloc/copy, y por lo tanto no garantiza una versión. He visto una gran cantidad de bloqueo de código al liberar impropiamente UIButton.

1

Agregar una vista de un controlador como subview a cualquier otra vista no retiene el controlador. El controlador se libera inmediatamente después de la llamada de liberación y cualquier acción de botón se enviará a la instancia desasignada.

podemos evitar esto manteniendo una fuerte referencia al controlador

@Property(nonatomic,strong)MyViewController *controller; 

o añadiendo un controlador de vista como el ChildViewController

[self addChildViewController:controller]; 
+0

cómo hacer esto en swift? –

+0

ok, estaba haciendo 'dejar que someVC = SomeViewController.init (..)' dentro de la vista cargue de la celda, poniendo 'someVC' fuera de 'viewdidload' como' var someVC: SomeViewController? 'Y luego inicie en vista si la carga mantiene referencia. Puede ayudar a alguien –

Cuestiones relacionadas