2014-06-26 11 views
5

Sono abbastanza nuovo per lo sviluppo di iOS. Ho letto dei problemi con lo ViewControllers che diventano enormi e vorrei seguire il design che ho visto nella risposta alla domanda precedente UITableView issue when using separate delegate/dataSource per la mia app che ha 2 tabelle diverse e un paio di pulsanti su uno schermo. Ma in qualche modo mi confondo nelle connessioni dello storyboard da fare tra TestTableViewController e TestTableTestViewController.Separazione del delegato/origine dati di UITableView dal ViewController principale

Qualcuno può fornire un progetto di lavoro di esempio o alcune schermate su come collegare il UITableView delegato, fonte dei dati e di uscita che collega il costume UIViewController sottoclasse separata (TestTableTestViewController) in storyboard per favore?

Inoltre, questa progettazione funziona con xCode 5/iOS 7 e versioni successive?

Nota: Per coloro che hanno spostato a Swift vi consiglio vivamente di utilizzare le estensioni veloci per l'origine dati delegato & e di fatto qualsiasi altra implementazione di una classe ereditata o il protocollo secondo la sezione 'Raggruppamento' di post sul blog Natasha del robot here

+0

È possibile fare riferimento al seguente link: http: //www.raywenderlich.com/50308/storyboards-tutorial-in-ios-7-part-1 –

+1

Grazie @SauravNagpal. Tutorial interessante ma anche qui il delegate/dataSource di TableView viene gestito dallo stesso ViewController come contenitore (PlayerViewController). Quello che sto cercando di ottenere è una schermata Home con "HomeScreenViewController.h/.m" che contiene (e gestisce) diversi oggetti UI (2 pulsanti, 2 diverse tabelle personalizzate sia con celle personalizzate) ma dove il delegato e dataSource per ogni la tabella viene gestita/implementata in file separati. Sto iniziando a pensare che questo è un design che non è più possibile in xCode5 ... Qualcuno può confermare/dimostrarmi che ti sbagli? – Litome

+0

Secondo me non puoi farlo usando StoryBoard.Per questo è necessario implementare attraverso il codice. –

risposta

2

È necessario creare un'altra classe di nome come MyTableViewDataSource e implementare TabbleViewDataSource metodi in esso. Crea una proprietà della tua classe di origine dati. Impostare la sorgente dati in ViewController Ecco l'examle:

@interface MyTableViewDataSource() 
@property (nonatomic, assign) int sectionOneRows; 
@property (weak) id<YourDelegate> delegate; 
@property (nonatomic, strong) NSArray *dataSourceArray; 
@end 

@implementation MyTableViewDataSource 
@synthesize delegate=_delegate; 

-(id) initDataSourceWithdArray:(NSArray *)array 
              delegate:(id)delegate 
{ 
    if (self = [super init]) { 
     self.dataSourceArray=array; 
     self.delegate = delegate; 
    } 
    return self; 
} 

#pragma mark - UITableViewDataSource 

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { 
    return 1; 
} 

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{ 
    return numberOfRows; 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

    UITableViewCell *cellToReturn = nil; 
    //Your code here 
    return cellToReturn 
} 

#pragma mark - UITableView Delegate 
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    [tableView deselectRowAtIndexPath:indexPath animated:YES]; 
    //Your logic here 
    //implement the delegate method in you ViewController 
     [self.delegate performSelector:@selector(loadDetailsAtIndexPath:)withObject:indexPath]; 
    } 
} 

Nei tuoi ViewController:

self.myDataSource = [[MyTableViewDataSource alloc] initDataSourceWithdArray:self.dataArray delegate:self]; 
[self.myTableView setDataSource:self.myDataSource]; 
[self.myTableView setDelegate:self.myDataSource]; 
[self.myTableView reloadData]; 

tuo metodo delegato:

-(void)loadDetailsAtIndexPath:(NSIndexPath *)indexPath 
{ 
    MyDetailViewController *myDetailController = [[MyDetailViewController alloc] initWithNibName:@"MyDetailViewController" bundle:nil]; 
    //Your logic here 
    [self.navigationController pushViewController:myDetailController animated:YES]; 
} 

Vai agli ispettori connessioni e apportare modifiche come questo :

enter image description here

L'origine dati per il tableView verrà impostata qui in modo programmato piuttosto in IB. Spero che questo ti possa aiutare.

+1

Grazie, potrebbe essere un modo programmatico per farlo. Ci proverò. Tuttavia, la domanda precedente a cui facevo riferimento (e che cercavo di seguire) menziona di fare la connessione tramite lo storyboard. Funziona bene per me quando il ViewController principale funge anche da delegato e dataSource per la tabella ma sembra impossibile connettere lo sbocco/delegato/dataSource della tabella al nuovo UITableViewController (TestTableTestViewController nel post indicato). Qualche aiuto sul lato dello storyboard di questo per favore? – Litome

+0

Ti suggerisco di farlo a livello di programmazione. Perché puoi gestire la tua fonte di dati e fluire con più controllo. – iBug

+0

Grazie per l'aiuto @iBug. Lo farò a livello di codice e seguirò il tuo esempio. – Litome

2

Premere e tenere premuto Ctrl e click + hold + drag sull'elemento che si desidera effettuare l'uscita nel file .h. farà da solo la connessione, basta nominarli. See This Video Tutorial

controllare anche questi tutorial

Link 1

Link 2

+1

Grazie ma non sono così nuovo per iOS. So come collegare delegato, dataSource e IBOutlet per una tabella semplice. In effetti, avevo un tavolo di lavoro prima di provare a estrarre il codice specifico di gestione tabella in un set separato di file seguendo le istruzioni della domanda precedente che ho collegato. Ma per qualche motivo, lo storyboard xCode non mi consente di connettere il delegato/dataSource o IBOutlet della vista tabella al nuovo controller di visualizzazione. Posso fare clic e trascinare quanto voglio, non si attacca mai. – Litome

+0

Ho appena controllato tutti e 3 i tutorial collegati che hai gentilmente fornito. Sembra che tutti e 3 siano per una tabella di base in cui ViewController è anche il delegate di TableView e dataSource. Tuttavia, sto cercando di seguire la progettazione spiegata qui: http://stackoverflow.com/questions/254354/uitableview-issue-when-using-separate-delegate-datasource e dissociare il delegate/dataSource della mia tabella dal main ViewController e non è possibile ottenere gli ultimi 2 passaggi (connessioni storyboard) per la connessione. Qualche aiuto su questo per favore? – Litome

Problemi correlati