2010-11-08 5 views
1

Cette question est en relation avec UITableView issue when using separate delegate/dataSource, même si j'ai un problème différent. Je commence juste à apprendre la programmation iPhone.Programmation d'Iphone: Plusieurs UITableViews lisant de la même source?

Fondamentalement, j'ai une vue principale avec une table. Sur l'événement d'un clic de cellule, une sous-vue avec une autre table est affichée. La source de données et le délégué pour la table de la vue principale sont définis comme propriétaires des fichiers, et j'ai ajouté le code nécessaire pour gérer les données de la table et tout va bien. Mais, lorsque la deuxième table de la sous-vue semble planter l'application, j'ai fait la même chose, définir la source de données et déléguer au propriétaire du fichier et répéter la même procédure que pour la table de la vue principale. Je n'ai aucune idée de pourquoi cela se passe.

La sous-vue possède son seul fichier nib/xib et sa propre sortie. Si je n'attache aucune source de données à la table de la sous-vue, elle prend les données de la table de la vue principale; Je ne comprends pas pourquoi, puisque j'ai défini la source de données comme étant le propriétaire du fichier.

Par exemple: le contrôleur FirstView possède une table FirstTable, la source de données et le délégué sont définis sur le propriétaire de Files. J'ai ajouté ce qui suit dans FirstView.m:

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 
    return 4; 
} 
// Customize the appearance of table view cells. 
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    static NSString *CellIdentifier = @"LibraryListingCell"; 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) { 
     cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault 
             reuseIdentifier:CellIdentifier] autorelease]; 
    } 
    cell.textLabel.text [email protected]"Table Cell"; 
    return cell; 
} 

Tout fonctionne parfaitement. Au moment où je le répète avec une deuxième table et une seconde vue, l'application se bloque en disant

reason: '-[UISectionRowData tableView:numberOfRowsInSection:]: unrecognized selector sent to instance 0x69188d0' 

Je l'ai fait exactement la même chose pour la deuxième table: mise en œuvre numberOfRowsInSection et cellForRowAtIndexPatch à l'intérieur secondview.m et définir le délégué et source de données de la deuxième table au propriétaire du fichier. Si je supprime le délégué et la source de données pour la deuxième table, l'application ne se bloque pas mais a une table vide dans la deuxième vue.

Des suggestions? ou est-ce que je manque un concept clé ici?

+0

Utilisez-vous des contrôleurs de vues séparés pour la vue principale et la sous-vue? – iphony

Répondre

1

Ceci est le principal contrôleur Voir fichier .h.

#import <UIKit/UIKit.h> 
#import "SubView.h" 
@interface StackOverTableSubViewViewController : UIViewController <UITableViewDelegate,UITableViewDataSource> 
{ 
    UIView *contentView; 
    UITableView *tblVw; 
    NSMutableArray *array; 
    SubView *SubViewObj; 
} 
@property(nonatomic,retain) UIView *contentView; 
@property(nonatomic,retain) UITableView *tblVw; 
@property(nonatomic,retain) NSMutableArray *array; 
@property(nonatomic,retain) SubView *SubViewObj; 
@end 

Ceci est le fichier principal du contrôleur View .m.

#import "StackOverTableSubViewViewController.h" 
@implementation StackOverTableSubViewViewController 
@synthesize contentView,tblVw,array,SubViewObj; 

// Implement loadView to create a view hierarchy programmatically, without using a nib. 
- (void)loadView 
{ 
    contentView=[[UIView alloc]initWithFrame:[[UIScreen mainScreen]bounds]]; 
    contentView.autoresizingMask=(UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight); 
    contentView.autoresizesSubviews=YES; 
    contentView.backgroundColor=[UIColor whiteColor]; 

    tblVw=[[UITableView alloc]initWithFrame:[[UIScreen mainScreen]bounds] style:UITableViewStylePlain]; 
    tblVw.dataSource=self; 
    tblVw.delegate=self; 
    tblVw.scrollEnabled=YES; 

    array=[[NSMutableArray alloc]init]; 
    [array addObject:@"Row1"]; 
    [array addObject:@"Row2"]; 
    [array addObject:@"Row3"]; 
    [array addObject:@"Row4"]; 
    [array addObject:@"Row5"]; 
    [array addObject:@"Row6"]; 
    [array addObject:@"Row7"]; 
    [array addObject:@"Row8"]; 
    [array addObject:@"Row9"]; 
    [array addObject:@"Row10"]; 
    [array addObject:@"Row11"]; 
    [array addObject:@"Row12"]; 
    [contentView addSubview:tblVw]; 
    self.view=contentView; 
} 

- (NSInteger)tableView:(UITableView *)table numberOfRowsInSection:(NSInteger)section 
{ 
    return [array count]; 
} 

// Row display. Implementers should *always* try to reuse cells by setting each cell's reuseIdentifier and querying for available reusable cells with dequeueReusableCellWithIdentifier: 
// Cell gets various attributes set automatically based on table (separators) and data source (accessory views, editing controls) 
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *CellIdentifier = @"CellIdentifier"; 

    // Dequeue or create a cell of the appropriate type. 
    // UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) 
    { 
     cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; 
     cell.accessoryType = UITableViewCellAccessoryNone; 
     cell.textLabel.lineBreakMode = UILineBreakModeWordWrap; 
     cell.textLabel.numberOfLines = 0; 
     [cell.textLabel sizeToFit]; 
    } 
    cell.textLabel.text=[array objectAtIndex:indexPath.row]; 
    return cell; 
} 

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    SubViewObj=[[SubView alloc]init]; 
    [self.view addSubview:SubViewObj.view]; 
} 

/* 
// Implement viewDidLoad to do additional setup after loading the view, typically from a nib. 
- (void)viewDidLoad { 
    [super viewDidLoad]; 
} 
*/ 

// Override to allow orientations other than the default portrait orientation. 
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { 
    return YES; 
} 

- (void)didReceiveMemoryWarning { 
    // Releases the view if it doesn't have a superview. 
    [super didReceiveMemoryWarning]; 
    // Release any cached data, images, etc that aren't in use. 
} 

- (void)viewDidUnload { 
    // Release any retained subviews of the main view. 
    // e.g. self.myOutlet = nil; 
} 

- (void)dealloc { 
    [contentView release]; 
    [SubViewObj release]; 
    [tblVw release]; 
    [array release]; 
    [super dealloc]; 
} 

@end 

Ajoutez un contrôleur de vue appelé subview. Voilà subview.h:

#import <UIKit/UIKit.h> 
@interface SubView : UIViewController <UITableViewDelegate,UITableViewDataSource> 
{ 
    UIView *contentView; 
    UITableView *tblVw; 
    NSMutableArray *array; 
} 
@property(nonatomic,retain) UIView *contentView; 
@property(nonatomic,retain) UITableView *tblVw; 
@property(nonatomic,retain) NSMutableArray *array; 
@end 

Et subview.m: #import "SubView.h" #import @implementation @synthesize contentView sous-vue, tblVw, tableau;

// Implement loadView to create a view hierarchy programmatically, without using a nib. 
- (void)loadView { 
    contentView=[[UIView alloc]initWithFrame:CGRectMake(200, 10, 300, 600)]; 
    contentView.autoresizingMask=(UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight); 
    contentView.autoresizesSubviews=YES; 
    contentView.backgroundColor=[UIColor whiteColor]; 

    tblVw=[[UITableView alloc]initWithFrame:CGRectMake(200, 10, 300, 600) style:UITableViewStylePlain]; 
    tblVw.dataSource=self; 
    tblVw.delegate=self; 
    tblVw.scrollEnabled=YES; 
    tblVw.layer.borderWidth=4.0; 
    tblVw.layer.borderColor=[[UIColor redColor]CGColor]; 
    array=[[NSMutableArray alloc]init]; 
    [array addObject:@"Data1"]; 
    [array addObject:@"Data2"]; 
    [array addObject:@"Data3"]; 
    [array addObject:@"Data4"]; 
    [array addObject:@"Data5"]; 
    [array addObject:@"Data6"]; 
    [array addObject:@"Data7"]; 
    [array addObject:@"Data8"]; 
    [array addObject:@"Data9"]; 
    [array addObject:@"Data10"]; 
    [array addObject:@"Data11"]; 
    [array addObject:@"Data12"]; 

    [contentView addSubview:tblVw]; 
    self.view=contentView; 

} 

/* 
// Implement viewDidLoad to do additional setup after loading the view, typically from a nib. 
- (void)viewDidLoad { 
    [super viewDidLoad]; 
} 
*/ 

- (NSInteger)tableView:(UITableView *)table numberOfRowsInSection:(NSInteger)section 
{ 
    return [array count]; 
} 

// Row display. Implementers should *always* try to reuse cells by setting each cell's reuseIdentifier and querying for available reusable cells with dequeueReusableCellWithIdentifier: 
// Cell gets various attributes set automatically based on table (separators) and data source (accessory views, editing controls) 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *CellIdentifier = @"CellIdentifier"; 

    // Dequeue or create a cell of the appropriate type. 
    // UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) 
    { 
     cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; 
     cell.accessoryType = UITableViewCellAccessoryNone; 
     cell.textLabel.lineBreakMode = UILineBreakModeWordWrap; 
     cell.textLabel.numberOfLines = 0; 
     [cell.textLabel sizeToFit]; 
    } 
    cell.textLabel.text=[array objectAtIndex:indexPath.row]; 
    return cell; 
} 

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { 
    // Overriden to allow any orientation. 
    return YES; 
} 

- (void)didReceiveMemoryWarning { 
    // Releases the view if it doesn't have a superview. 
    [super didReceiveMemoryWarning]; 
    // Release any cached data, images, etc that aren't in use. 
} 

- (void)viewDidUnload { 
    [super viewDidUnload]; 
    // Release any retained subviews of the main view. 
    // e.g. self.myOutlet = nil; 
} 

- (void)dealloc { 
    [super dealloc]; 
} 

@end 

Essayez ce code. Cette application a été faite pour l'iPad. Changez les dimensions au besoin pour l'iPhone.

+0

hi iphony, va essayer votre code et voir, merci – Veeru

3

Vous pouvez utiliser les mêmes méthodes de source de données et de délégation pour plusieurs tables. Vous devez mentionner dans quelle table vous faites des opérations. Par exemple:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    if ([tableView isEqual:TableView1]) 
    { 
     //do work for tableview1 
    } 
    else if([tableView isEqual:TableView2]) 
    { 
     //do operations for tableview2 
    } 
} 
+0

Merci, mais je veux utiliser différentes sources de données pour différentes tables. Et dans mon cas, il prend la même source de données, ce que je ne souhaite pas. Comme je l'ai mentionné, la vue principale fonctionne parfaitement, mais la sous-vue prend soit de la source de données de la vue principale ou se bloque dès que je connecte une prise à celle-ci. Je ne sais pas pourquoi, y a-t-il une logique? – Veeru

+0

hmm quelqu'un? J'ai désespérément besoin d'aide pour le tri, je n'ai pas pu trouver d'explication après les heures de googling. – Veeru

+0

Très bien, cela fonctionne iphony - la différence était, ne pas définir la source de données et les délégués dans le IB, mais de les ajouter manuellement au cours de la méthode viewdidload. Si cela aide quelqu'un, j'ai supprimé la source de données et les liens de délégué de IB, et utilisé la suggestion de iphony pour mettre le ds et déléguer à soi sur viewDidLoad .. – Veeru

1

J'ai eu le même problème EXACTE et l'ai résolu en supprimant ma connexion de la source de données de la vue table au propriétaire des fichiers. Ensuite, j'ai collé dans le code ci-dessous en remplaçant le cellForRowAtIndexPath existant. J'ai dû modifier le nom du tableau pour qu'il corresponde à mon tableau, puis reconnecter la source de données au propriétaire du fichier, et cela a commencé à fonctionner. Doit avoir été un snafu dans mon code de fonction quelque part.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *CellIdentifier = @"CellIdentifier"; 
    // Dequeue or create a cell of the appropriate type. 
    // UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) 
    { 
     cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; 
     cell.accessoryType = UITableViewCellAccessoryNone; 
     cell.textLabel.lineBreakMode = UILineBreakModeWordWrap; 
     cell.textLabel.numberOfLines = 0; 
     [cell.textLabel sizeToFit]; 
    } 
    cell.textLabel.text=[array objectAtIndex:indexPath.row]; 
    return cell; 
} 
Questions connexes