web-dev-qa-db-fra.com

Les méthodes de délégué et de source de données UITableView ne sont pas appelées

J'ai un UIView qui contient un UITableView. Le délégué de la vue de table est défini sur mon UIView, mais il n'appelle jamais les méthodes de délégué:

-(id)init {
    self = [super init];
    if (self) {
        self.tableView = [[UITableView alloc] initWithFrame:self.bounds];
        self.tableView.autoresizingMask = UIViewAutoresizingFlexibleWidth;
        self.tableView.dataSource = self;
        self.tableView.delegate = self;
        self.tableView.scrollEnabled = NO;
        self.tableView.layer.cornerRadius = PanelCornerRadius;
        [self addSubview:self.tableView];
    }
    return self;
}

#pragma mark - UITableViewDelegate methods

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {

    NSLog(@"height for row");
    int height = [self heightForRowAtIndexPath:indexPath];

    return height;
}

#pragma mark - UITableViewDataSource methods

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {

    NSLog(@"number of rows");
    if (self.manager.fetchOperation.dataFetchProblem) {
        return 1;
    }

    int numberOfRows = [self.delegate numberOfSectionsInPanel:self];

    return numberOfRows;
}

J'ai exploré toutes les options auxquelles je peux penser, mais je n'arrive pas à trouver la racine du problème.

EDIT: Inclus le numberOfRowsInSection. Il pourrait potentiellement renvoyer 0, mais il n'aura jamais cette chance car le "nombre de lignes" de NSLog n'est jamais appelé.

11
Andrew

Pouvez-vous s'il vous plaît écrire le code que vous avez écrit sur votre méthode cellForRowAtIndexPath:? Parce que je ne trouve rien de mal à votre code. 

Appelez-vous votre UIView depuis un autre ViewController? Si oui comment?

J'ai fait quelque chose comme ça une fois. J'ai déclaré une méthode dans UIView comme ceci:

- (void)setUpTableView{
    self.tableview.delegate=self;
    self.tableview.dataSource=self;
}

Et puis j'ai appelé setUpTableView à partir du contrôleur de vue auquel j'ai ajouté cette vue, comme ceci:

[self.yourView setUpTableView]; 

Cela pourrait aider. Merci.

16
try catch finally

J'ai eu un problème similaire, ma solution était parce que je n'avais pas défini le nombre de sections à 1.

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    // Return the number of sections.
    return 1;
}
13
Darkin

Vous n'avez pas besoin d'utiliser UIViewController, c'est juste un écran de fumée. Vous n'avez pas non plus besoin d'ajouter au .h, bien que vous devriez le faire de toute façon, car Xcode se plaindra sinon, et vous n'obtiendrez pas le nom de méthode auto complete.

Je viens d'écrire un projet de test qui intègre une vue sous forme de tableau dans un UIView normal et qui fonctionne bien. Assurez-vous simplement que votre code d'initialisation est appelé. Je parie que vous devez le déplacer pour réveillerFromNib.

3
jsd

Vous devriez déclarer votre vue comme ceci @interface MyView : UIView <UITableViewDelegate, UITableViewDataSource>

BTW: J'aurais un ViewController qui "contrôle" votre vue et votre vue de table, et que ViewController soit le délégué et la source de données de la vue de table.

3
gWiz

J'ai rencontré le même problème une fois, quelle erreur idiote j'ai commise dans initWithCoder que j'ai appelé [super init]. TableView était en xib

-(id) initWithCoder:(NSCoder *)aDecoder
{
    self = [super init]
}

Au lieu de 

-(id) initWithCoder:(NSCoder *)aDecoder
{
    self = [super initWithCoder:aDecoder];
}

Juste vérifier si ce n'est pas le cas

1
user3894518

essaye ça:

override func numberOfSections(in tableView: UITableView) -> Int {
    return 1
}

j'ai aussi eu ce problème stupide 

1
ironRoei

Essayez de changer votre UIView en UIViewController et dans viewDidLoad, appelez 

[[UITableView alloc] initWithFrame:style:] pour créer votre vue tableau.

Définissez vous-même comme délégué et source de données, comme vous l'avez fait ci-dessus, puis ajoutez cette UITableView comme sous-vue dans ce contrôleur.

0
Unheilig