2012-06-23 4 views
6

No puedo conectar la fuente de datos y delegar las salidas de la vista de tabla dentro del guión gráfico a mi clase delegada personalizada. Me gustaría delegar esas funciones de tabla a otra clase. Hay algo que básicamente he malentendido con respecto a la delegación, puntos de venta y el cableado de las cosas en un guión gráfico.UITableView datasource y delegate no se conectarán a una clase personalizada

Antecedentes

Tengo un UIViewController que tiene una vista que contiene una UIPickerView y entre otras cosas, un UITableView.
He llegado al punto en que mi UIViewController es demasiado grande y me gustaría mover las funciones relacionadas con la tabla a otra clase.

He creado la siguiente clase para contener los métodos de tabla como numberOfSectionsInTableView:.

@interface ExerciseTableDelegate : NSObject <UITableViewDelegate, UITableViewDataSource> 

@property (strong, nonatomic) ExerciseDataController *dataController; 

@end 

He pensado poner una referencia a la clase anterior en mi UIViewController

@interface ExerciseViewController : UIViewController <UIPickerViewDataSource, UIPickerViewDelegate> 
{ 
    UIPickerView *exercisePicker; 
} 

@property (strong, nonatomic) IBOutlet ExerciseTableDelegate *tableDelegate; 

@end 

Tenía la esperanza de que dentro del guión, cuando me arrastre uno de la fuente de datos o delegar salidas de mi mesa ver en el UITableViewController me daría la posibilidad de conectarme a mi clase delegada. No fue así.

Intenté crear un objeto dentro del guión gráfico, dándole la clase ExerciseTableDelegate. Podría arrastrar el delegado de la vista de tabla al objeto, pero este no es el mismo objeto que configuré en mi AppDelegate.

Mi aplicación delegado

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    UINavigationController *navigationController = (UINavigationController *)self.window.rootViewController; 
    ExerciseViewController *rootViewController = (ExerciseViewController *)[[navigationController viewControllers] objectAtIndex:0]; 

    ExerciseTableDelegate *tableDelegate = [[ExerciseTableDelegate alloc]init]; 
    ExerciseDataController *dataController = [[ExerciseDataController alloc] init]; 

    tableDelegate.dataController = dataController; 
    rootViewController.tableDelegate = tableDelegate; 

    // Override point for customization after application launch. 
    return YES; 
} 
  • ¿Necesito hacer mi objeto un producto único y todavía inicializar en el delegado?
  • ¿Tengo que hacer esta configuración en código en lugar de en el Storyboard?
  • ¿Es incorrecto crear un objeto en el guión gráfico?

Siento que estoy cerca, pero creo que estoy haciendo demasiado.

Respuesta

1

Si desea acceder a la instancia de ExerciseTableDelegate que configuró en el delegado de su aplicación, tendrá que conectarla a su vista de tabla en el código, ya que no se podrá acceder desde el guión gráfico, ya que ' he encontrado, agregar un nuevo objeto en el guión gráfico crea una nueva instancia.

Afortunadamente, esto es bastante simple de implementar. En el método de su controlador de vista de tabla viewDidLoad, añada lo siguiente:

self.tableView.delegate = self.tableDelegate; 
self.tableView.datasource = self.tableDelegate; 

Esto volverá a punto de la fuente de datos y delegar a su objeto separado.

+0

Gracias @jrturton. Eso hizo el truco. Además de eso, necesitaba hacer lo estándar para crear un IBOutlet para el TableView de ExerciseViewControllers y necesitaba conectarlo en el storyboard. – AllTheThingsICanDo

Cuestiones relacionadas