it-roy-ru.com

UITableView делегат и методы источника данных не вызывают

У меня есть UIView, который содержит UITableView. Делегат табличного представления установлен на мой UIView, но он никогда не вызывает методы делегата:

-(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;
}

Я изучил все возможные варианты, но, похоже, не могу найти корень проблемы.

Правка: Включено число OfRowsInSection. Он может потенциально вернуть 0, но никогда не получит такой шанс, потому что NSLog «количество строк» ​​никогда не вызывается.

11
Andrew

Можете ли вы написать код, который вы написали в вашем cellForRowAtIndexPath: метод? Потому что я не могу найти ничего плохого в вашем коде. 

Вы вызываете свой UIView с какого-то другого ViewController? Если да, то как?

Однажды я сделал что-то подобное. Я объявил метод в UIView так:

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

И затем я вызвал setUpTableView из контроллера представления, к которому я добавил это представление, вот так:

[self.yourView setUpTableView]; 

Это может помочь. Благодарю.

16
try catch finally

У меня была похожая проблема, мое решение состояло в том, что я не установил количество секций равным 1.

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

Вам не нужно использовать UIViewController, это просто дымовая завеса. Вам также не нужно добавлять в .h, хотя вы должны сделать это в любом случае, потому что Xcode будет жаловаться иначе, и вы не получите автозаполнение имени метода.

Я только что написал тестовый проект, который встраивает табличное представление в обычный UIView, и он отлично работает. Просто убедитесь, что ваш код инициализации вызывается. Могу поспорить, что вам нужно переместить его в пробуждение от Nib.

3
jsd

Вы должны объявить свое мнение следующим образом @interface MyView : UIView <UITableViewDelegate, UITableViewDataSource>

Кстати, у меня был бы ViewController, который «контролирует» ваше представление и табличное представление, и ViewController был бы делегатом и источником данных для табличного представления.

3
gWiz

Однажды я столкнулся с той же проблемой: глупая ошибка, которую я совершил, была внутри initWithCoder, который я назвал [super init]. TableView был в Xib

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

Вместо 

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

Просто проверьте, если это не так

1
user3894518

попробуй это:

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

у меня тоже была эта глупая проблема 

1
ironRoei

Попробуйте изменить UIView на UIViewController и в viewDidLoad, позвоните 

[[UITableView alloc] initWithFrame:style:] для создания вашего табличного представления.

Установите self в качестве делегата и источника данных, как вы делали выше, а затем добавьте этот UITableView как Subview в этом контроллере.

0
Unheilig