2011-09-08 18 views
6

Estoy intentando configurar un UITableViewController para que su tableView pertenezca a mi subclase personalizada. Mi método loadView Actualmente tiene este aspecto:reemplazando loadView en una subclase UITableViewController

- (void) loadView { 
    MyTableViewSubclass* tv = [[[MyTableViewSubclass alloc]initWithFrame: CGRectZero style: UITableViewStylePlain]autorelease]; 
    self.view = tv; 
    self.tableView = tv; 
} 

estoy recibiendo choques más tarde que vas Si comento hacia fuera el método anterior. Entonces algo falta. ¿Pero que?

Documentación de Apple says No debería estar llamando super en loadView. Lo cual tiene sentido, porque quiero que la vista tenga mi clase, no la de ellos.

cosas I han intentado que no ayudan:

  • reescribir el método loadView por lo que está creando un UITableView llanura. Esto me dice que el origen del problema no radica en la implementación de mi subclase.
  • Llama a [super viewDidLoad] desde mi método loadView. De los documentos de Apple, no está claro si se llama a ese método desde loadView o después. En cualquier caso, agregarlo al final de mi método loadView no ayuda.

Una cosa que he intentado que hace solucionar el problema, pero en contra del propósito:

  • comentario a cabo mi método loadView.

EDITAR: la caída se muestra a continuación. Sucede después de que el usuario hace alguna entrada. También sucede de la misma manera si estoy creando un UITableView normal en lugar de mi subclase. Están sucediendo muchas cosas en la aplicación, y algo en mi anulación de loadView [o más probablemente, algo que falta en mi anulación] está causando que el estado sea diferente, lo que a su vez lleva al colapso. Pero no veo una buena manera de rastrear lo que es diferente.

2011-09-08 12:44:59.591 MyAppName[97649:207] *** Terminating app due to uncaught exception 'NSRangeException', reason: '-[MyTableViewSubclass scrollToRowAtIndexPath:atScrollPosition:animated:]: row (0) beyond bounds (0) for section (0).' 
+0

¿Podría decirnos qué dice el registro de fallos? -Gracias – Madhu

+0

¿Se puede agregar la salida de la consola desde el bloqueo? – chown

Respuesta

12

Resulta que necesito configurar el dataSource y delegar de mi tableView como parte de la carga. Entonces cuando hago esto, todo funciona bien:

- (void) loadView { 
    MyTableViewSubclass* tv = [[[MyTableViewSubclass alloc]initWithFrame: CGRectZero style: UITableViewStylePlain]autorelease]; 
    tv.dataSource = self; 
    tv.delegate = self; 
    self.view = tv; 
    self.tableView = tv; 
} 
+0

+1 para la porción de liberación automática muy importante. –

+0

Tengo una pregunta. ¿Este enfoque no derrota el propósito de MVC? ¿Porque ahora el controlador solo funciona con un tipo de tabla a menos que subclases el controlador y anule la carga de nuevo? –

+0

Sobre la cuestión de MVC, ViewController podría estar vinculado a la Vista ahora, pero se ajusta mejor a un modelo MVC separando el Controlador de la Vista. Ver código en la Vista, código del Controlador en ViewController. Sin una separación como esta, estás descargando todo el código en un ViewController. – AgentK

1

La respuesta de William también me ayudó a superar el último obstáculo.

Para agregar un ejemplo rápido, el patrón que habitualmente utilizo es:

class SomeTableViewController: UITableViewController { 

    private var childView: SomeTableView! { return tableView as! SomeTableView } 

    override func loadView() { 
     tableView = SomeTableView(frame: UIScreen.mainScreen().bounds, style: .Plain) 
     tableView.delegate = self 
     tableView.dataSource = self 
     view = tableView 
    } 

} 

Usted está entonces libre para referirse a la vista personalizada como childView en otros lugares en el ViewController.

Cuestiones relacionadas