2010-09-07 6 views
4

L'application iOS sur laquelle je travaille actuellement est basée sur des tabulations, et l'une des onglets est UITableViewController. Le truc, quand j'ouvre cet onglet avec une source de données vide (pour une raison quelconque), je voudrais apporter une autre vue, avec une sorte de message/image, au lieu de la vue vide que je reçois avec le viewviewcontroller .Présenter une vue par défaut au lieu de tableview si la source de données est vide

J'ai essayé quelque chose comme ça:

- (void)viewWillAppear:(BOOL)animated { 
    if ([myData count] == 0) { 
     if (!emptyView) { 
      emptyView = [[UIView alloc] initWithFrame:self.view.frame]; 
      UILabel *emptyMsg = [[UILabel alloc] initWithFrame:CGRectMake(0, self.view.frame.size.height/2, self.view.frame.size.width, 20)]; 
      emptyMsg.text = @"This is Empty !"; 
      emptyMsg.textAlignment = UITextAlignmentCenter; 

      [emptyView addSubview:emptyMsg]; 
     } 

     [self.view insertSubview:emptyView atIndex:0]; 
    } 

    else { 
     if (emptyView != nil) { [emptyView removeFromSuperview]; emptyView = nil; } 
     [self.tableView reloadData]; 
     [super viewWillAppear:animated]; 
    } 
} 

Avec emptyView défini comme un iVar dans le contrôleur de vue.

Mais cela ne fonctionne pas comme prévu, et je ne peux pas trouver la raison:/

Pourrait-vous donner un coup d'oeil et me donner la bonne façon de faire ce genre de comportement?

Merci,

+0

myDatas ... 'données' est au pluriel ... juste dire – Felixs

+0

fixe! Maintenant, tout le monde sait que je ne suis pas un anglophone: p Merci;) – squizz

Répondre

1

UITableViewController ne vous permet pas d'ajouter des sous-vues à sa vue (la tableView).

Vous devez créer un UIViewController et ajouter le UITableView avec votre emptyView en option. N'oubliez pas de régler le dataSource et le delegate! Mise à jour: J'ai créé une sous-classe de UIViewController pour éviter d'imiter UITableViewController à chaque fois.

.h

// 
// GCTableViewController.h 
// GCLibrary 
// 
// Created by Guillaume Campagna on 10-06-17. 
// Copyright 2010 LittleKiwi. All rights reserved. 
// 

#import <UIKit/UIKit.h> 

//Subclass of UIViewController that mimicks the UITableViewController except that the tableView is a subview of self.view and allow change of the frame of the tableView 

@interface GCTableViewController : UIViewController <UITableViewDelegate, UITableViewDataSource> 

@property (nonatomic, readonly) UITableView *tableView; 

- (id) initWithStyle:(UITableViewStyle)style; 

//Subclass if you want to change the type of tableView. The tableView will be automatically placed later 
- (UITableView*) tableViewWithStyle:(UITableViewStyle) style; 

@end 

.m

// 
// GCTableViewController.m 
// GCLibrary 
// 
// Created by Guillaume Campagna on 10-06-17. 
// Copyright 2010 LittleKiwi. All rights reserved. 
// 

#import "GCTableViewController.h" 

@implementation GCTableViewController 

@synthesize tableView; 

- (id) initWithStyle:(UITableViewStyle) style { 
    if (self = [super initWithNibName:nil bundle:nil]) { 
     tableView = [[self tableViewWithStyle:style] retain]; 
     self.tableView.delegate = self; 
     self.tableView.dataSource = self; 
    } 
    return self; 
} 

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    [self.view addSubview:self.tableView]; 

    self.tableView.frame = self.view.bounds; 
    self.tableView.autoresizingMask = (UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight); 
} 

- (void) viewWillAppear:(BOOL)animated { 
    [super viewWillAppear:animated]; 

    [self.tableView deselectRowAtIndexPath:[self.tableView indexPathForSelectedRow] animated:YES]; 
} 

#pragma mark TableView methods 

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

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

- (UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    return nil; 
} 

#pragma mark Getter 

- (UITableView *) tableViewWithStyle:(UITableViewStyle)style { 
    return [[[UITableView alloc] initWithFrame:CGRectZero style:style] autorelease]; 
} 

- (void)dealloc { 
    [tableView release]; 
    tableView = nil; 

    [super dealloc]; 
} 


@end 
+0

J'avais peur que quelqu'un me le dise! Je pourrais basculer vers un UIViewcController standard en dernier recours si personne d'autre n'a une autre idée ... Merci! – squizz

+0

Personnellement, j'ai fait une sous-classe de UIViewController qui imite UITableViewController exonéré pour le fait qu'il vous permet d'ajouter des sous-vues. Mettra à jour la réponse. – gcamp

+0

Beau travail, merci de partager! – squizz

0

Vous pouvez peut-être essayer régler le nombre de lignes à zéro. Ensuite, insérez la vue sans résultats en tant que vue d'en-tête.

+0

C'est une idée ... Je n'ai jamais joué avec Header Views avant: pouvez-vous le configurer pour que le message puisse être affiché verticalement centré? Merci! – squizz

4

Je résolu ce problème en ajoutant un UIView dans l'en-tête tableview avec une taille d'image égale à la taille tableview et interdisant l'interaction de l'utilisateur sur le tableview:

UIView *emptyView = [[UIView alloc] initWithFrame:self.tableView.frame]; 
    /* Customize your view here or load it from a NIB */ 
    self.tableView.tableHeaderView = emptyView; 
    self.tableView.userInteractionEnabled = NO; 

Lorsque vous avez des données vous suffit de supprimer l'en-tête et réactivez interaction de l'utilisateur:

self.tableView.tableHeaderView = nil; 
    self.tableView.userInteractionEnabled = YES; 
+0

Une suggestion à votre réponse: carase de '' userInteractionEnabled = NO; '' tous les éléments interactifs (ie.'' UIButton'' etc) dans '' emptyView'' ne fonctionnera pas correctement. Vous devriez plutôt utiliser '' self.tableView.scrollEnabled = NO; ''; – damirstuhec

Questions connexes