2014-06-26 14 views
5

Ich bin ziemlich neu in der iOS-Entwicklung. Ich habe über die Probleme mit ViewControllers gelesen, die riesig werden und dem Entwurf folgen möchten, den ich in der Antwort zu dieser vorhergehenden Frage UITableView issue when using separate delegate/dataSource für meine APP gesehen habe, die 2 verschiedene Tabellen und einige Knöpfe auf einem Schirm hat. Aber irgendwie bin ich verwirrt in den Storyboard-Verbindungen zwischen TestTableViewController und TestTableTestViewController zu machen.Trennen der Delegate/Datenquelle von UITableView von Main ViewController

Kann mir jemand eine Probe Arbeitsprojekt zur Verfügung stellen oder einige Screenshots, wie die UITableView delegieren, Datenquelle und Verbindungsausgang zum separaten benutzerdefinierten UIViewController Unterklasse (TestTableTestViewController) in Storyboard bitte verbinden?

Funktioniert dieses Design auch mit xCode 5/iOS 7 und höher?

Hinweis: Für diejenigen Swift bewegt hat Ich empfehle rasche Erweiterungen für die Delegierten & Datenquelle und in der Tat jede andere Implementierung eines vererbten Klasse oder Protokoll gemäß der ‚Gruppierung‘ Abschnitt von Natasha Der Roboter Blogbeitrag here

+0

Sie können auf folgenden Link verweisen: http://www.raywenderlich.com/50308/storyboards-tutorial-in-ios-7-part-1 –

+1

Vielen Dank @SauravNagpal. Interessantes Tutorial, aber auch hier wird der TableView delegate/dataSource vom selben ViewController wie sein Container (PlayerViewController) behandelt. Was ich versuche, ist ein Home-Bildschirm mit "HomeScreenViewController.h/.m", die mehrere UI-Objekte enthält (und behandelt) (2 Schaltflächen, 2 verschiedene benutzerdefinierte Tabellen mit benutzerdefinierten Zellen), aber wo die Delegate und dataSource für jeden Tabelle werden in separaten Dateien behandelt/implementiert. Ich fange an zu denken, dass dies ein Design ist, das in xCode5 nicht mehr möglich ist ... Kann mir bitte jemand bestätigen/beweisen? – Litome

+0

Laut mir können Sie das nicht mit storyBoard tun.Dafür müssen Sie Code implementieren. –

Antwort

2

überprüfen Sie haben eine andere Klasse als MyTableViewDataSource und implementieren TabbleViewDataSource Methoden in ihm benannt zu erstellen. Erstellen Sie eine Eigenschaft Ihrer Datenquellenklasse. Stellen Sie Datenquelle in ViewController Hier ist die 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]; 
    } 
} 

In Ihrem ViewController:

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

Ihr Delegatmethode:

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

Gehen Sie zu den Verbindungen Inspektoren und Änderungen vornehmen, wie dies :

enter image description here

Datenquelle für die tableView wird hier eher in IB programmatisch eingestellt. Ich hoffe, dass dir das weiterhilft.

+1

Danke, das könnte ein programmatischer Weg sein. Ich werde es versuchen. Die vorherige Frage, auf die ich Bezug genommen habe (und versuchen zu folgen), erwähnt die Verbindung über das Storyboard. Das funktioniert gut für mich, wenn der Haupt-ViewController auch als Delegate und DataSource für die Tabelle fungiert, aber es scheint unmöglich, die outlet/delegate/dataSource der Tabelle mit dem neuen UITableViewController (TestTableTestViewController im entsprechenden Post) zu verbinden. Irgendwelche Hilfe auf der Storyboardseite bitte? – Litome

+0

Ich empfehle Ihnen, dies programmgesteuert zu tun. Weil Sie Ihre Datenquelle besser steuern können. – iBug

+0

Vielen Dank für Ihre Hilfe @iBug. Ich mache es programmatisch und folge deinem Beispiel. – Litome

2

Drücken und halten Sie Ctrl und click + hold + drag zum Produkt möchten Sie Ausgang machen Datei .h. es wird die Verbindung selbst herstellen, Sie müssen sie nur benennen. See This Video Tutorial

auch diese Tutorials

Link 1

Link 2

+1

Vielen Dank, aber ich bin nicht so neu in iOS. Ich kann Delegat, dataSource und IBOutlet für eine einfache Tabelle verbinden. Tatsächlich hatte ich eine funktionierende Tabelle, bevor ich versuchte, den Tabellenverwaltungsspezifischen Code in eine separate Gruppe von Dateien zu extrahieren, die den Anweisungen in der vorherigen Frage, die ich verlinkt hatte, folgten. Aber aus irgendeinem Grund lässt xCode Storyboard mich nicht die Delegate/dataSource oder IBOutlet der Tabellenansicht mit dem neuen View-Controller verbinden. Ich kann klicken und ziehen so viel wie ich will, es haftet nie. – Litome

+0

Ich habe gerade alle 3 verlinkten Tutorials überprüft, die Sie freundlicherweise zur Verfügung gestellt haben. Es scheint, dass alle 3 für eine Basistabelle sind, wo der ViewController auch der Delegate und die dataSource der TableView ist. Allerdings versuche ich, das hier erläuterte Design zu folgen: http://StackOverflow.com/Questions/254354/uitableview-issue-when-using-separate-delegate-datasource und dissoziiere die delegate/dataSource meiner Tabelle von der Hauptleitung ViewController und kann die letzten 2 Schritte (Storyboard-Verbindungen) nicht verbinden. Irgendwelche Hilfe dazu bitte? – Litome

Verwandte Themen