2012-06-23 10 views
6

Nie mogę połączyć źródła danych i przekazać ujścia widoku tabeli w scenorysie do mojej niestandardowej klasy delegowanej. Chciałbym delegować te funkcje tabel do innej klasy. Jest coś, czego zasadniczo nie rozumiem w odniesieniu do delegacji, rynków zbytu i okablowania w scenorysie.Źródło danych i delegata UITableView nie połączy się z niestandardową klasą

Tło

mam UIViewController że ma widok zawierający UIPickerView i między innymi, UITableView.
Osiągnąłem punkt, w którym mój UIViewController jest zbyt duży i chciałbym przenieść funkcje związane z tabelą do innej klasy.

Utworzono następującą klasę zawierającą te metody tabel, takie jak numberOfSectionsInTableView:.

@interface ExerciseTableDelegate : NSObject <UITableViewDelegate, UITableViewDataSource> 

@property (strong, nonatomic) ExerciseDataController *dataController; 

@end 

myślałem umieścić odniesienie do klasy wyżej w moim UIViewController

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

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

@end 

miałem nadzieję, że w serii ujęć, kiedy przeciągnij jeden z DataSource lub delegatów placówek moim stole widok na UITableViewController dałby mi możliwość połączenia się z moją delegowaną klasą. Tak nie było.

Następnie próbowałem utworzyć obiekt w serii ujęć, nadając mu klasę ExerciseTableDelegate. Mogłem wtedy przeciągnąć delegata widoku tabeli do obiektu, ale nie jest to ten sam obiekt, który ustawiłem w moim AppDelegate.

Moja aplikacja delegat

- (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; 
} 
  • Czy muszę zrobić mój obiekt singleton i nadal zainicjować go w delegata?
  • Czy muszę wykonać tę konfigurację w kodzie zamiast w Storyboard ?
  • Czy tworzenie obiektu w storybooku jest niewłaściwe?

Czuję, że jestem blisko, ale myślę, że robię za dużo.

Odpowiedz

1

Jeśli chcesz uzyskać dostęp do instancji ExerciseTableDelegate skonfigurowanej w delegacie aplikacji, musisz połączyć go z widokiem tabeli w kodzie, ponieważ nie będzie dostępny z serii ujęć - tak jak " ve found, dodanie nowego obiektu do storyboardu tworzy nową instancję.

Na szczęście jest to całkiem proste do wdrożenia. W sposobie według tabeli widoku kontrolera viewDidLoad, dodać następujące:

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

Spowoduje to ponowne punkt DataSource i przekazać do odrębnego przedmiotu.

+0

Dziękuję @jrturton. To wystarczyło. Oprócz tego, musiałem zrobić standardową rzecz, aby stworzyć IBOutlet dla ExerciseViewControllers tableView i potrzebowałem podłączyć to do storyboardu. – AllTheThingsICanDo

Powiązane problemy