Установите UITableView Delegate и DataSource
Это моя проблема:
У меня этот маленький UITableView
в моей раскадровке: ![enter image description here]()
И это мой код:
SmallTableViewController.h
#import <UIKit/UIKit.h>
#import "SmallTable.h"
@interface SmallViewController : UIViewController
@property (weak, nonatomic) IBOutlet UITableView *myTable;
@end
SmallTableViewController.m
#import "SmallViewController.h"
@interface SmallViewController ()
@end
@implementation SmallViewController
@synthesize myTable = _myTable;
- (void)viewDidLoad
{
SmallTable *myTableDelegate = [[SmallTable alloc] init];
[super viewDidLoad];
[self.myTable setDelegate:myTableDelegate];
[self.myTable setDataSource:myTableDelegate];
// Do any additional setup after loading the view, typically from a nib.
}
- (void)viewDidUnload
{
[super viewDidUnload];
// Release any retained subviews of the main view.
}
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
}
@end
Теперь, как вы можете видеть, я хочу установить экземпляр с именем myTableDelegate в качестве делегата и DataSource myTable.
Это источник класса SmallTable.
SmallTable.h
#import <Foundation/Foundation.h>
@interface SmallTable : NSObject <UITableViewDelegate , UITableViewDataSource>
@end
SmallTable.m
@implementation SmallTable
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
// Return the number of sections.
return 0;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
// Return the number of rows in the section.
return 5;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
// Configure the cell...
cell.textLabel.text = @"Hello there!";
return cell;
}
#pragma mark - Table view delegate
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
NSLog(@"Row pressed!!");
}
@end
Я применил все теги UITableViewDelegate
и UITableViewDataSource
, которые необходимы для приложения. Почему он просто падает перед представлением?
Спасибо!!
Ответы
Ответ 1
Риккер прав. Но я думаю, вам нужно использовать квалификатор strong
для вашего свойства, так как в конце вашего метода viewDidLoad
объект все равно будет освобожден.
@property (strong,nonatomic) SmallTable *delegate;
// inside viewDidload
[super viewDidLoad];
self.delegate = [[SmallTable alloc] init];
[self.myTable setDelegate:myTableDelegate];
[self.myTable setDataSource:myTableDelegate];
Но есть ли причина использовать выделенный объект (источник данных и делегат) для вашей таблицы? Почему вы не устанавливаете SmallViewController
в качестве источника и делегата для своей таблицы?
Кроме того, вы не создаете ячейку правильным способом. Эти строки ничего не делают:
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
// Configure the cell...
cell.textLabel.text = @"Hello there!";
dequeueReusableCellWithIdentifier
просто извлекает из таблицы "кеш" ячейку, которая уже создана, и которая может быть повторно использована (чтобы избежать потребления памяти), но вы еще не создали.
Где вы делаете alloc-init
? Сделайте это вместо:
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if(!cell) {
cell = // alloc-init here
}
// Configure the cell...
cell.textLabel.text = @"Hello there!";
Кроме того, скажите numberOfSectionsInTableView
, чтобы вернуть 1 вместо 0:
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
// Return the number of sections.
return 1;
}
Ответ 2
Предположительно, вы используете ARC? Ваш myTableDelegate
ссылается только на локальную переменную в viewDidLoad
- как только этот метод заканчивается, он отменяется. (В шаблоне делегирования/источника данных объекты не имеют своих делегатов, поэтому ссылки на таблицы ссылаются на ваш объект, являются слабыми.) Я бы не ожидал, что только один приведет к сбою, но, скорее всего, это ключ к вашей проблеме.
Ответ 3
setDelegate
не сохранит делегата.
и
numberOfSectionsInTableView
метод должен возвращать 1 вместо 0;
Ответ 4
(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
// Return the number of sections.
return 0;
}
Количество секций должно быть установлено как минимум на один
Ответ 5
Делегат объекта UITableView должен принять протокол UITableViewDelegate. Дополнительные методы протокола позволяют делегату управлять выборами, настраивать заголовки и нижние колонтитулы разделов, помогать удалять методы.