2013-11-07 2 views
4
#import "AssignmentsViewController.h" 
#import "Assignment.h" 

@interface AssignmentsViewController() 

@property NSMutableArray *assignments; 
@property (weak, nonatomic) IBOutlet UITableView *tableView; 

@end 

@implementation AssignmentsViewController 

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 
{ 
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; 
    if (self) { 
     // Custom initialization 
    } 
    return self; 
} 

- (void)viewDidLoad 
{ 
    NSLog(@"viewDidLoad"); 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view. 
    self.assignments = [[MySingleton sharedMySingleton] assignments]; 
    self.tableView.delegate = self; 
    self.tableView.dataSource = self; 
} 

- (void)viewWillAppear:(BOOL)animated { 
    NSLog(@"viewWillAppear"); 
    [self.tableView reloadData]; 
} 

- (void)didReceiveMemoryWarning 
{ 
    [super didReceiveMemoryWarning]; 
    // Dispose of any resources that can be recreated. 
} 

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

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 
    NSLog(@"numberOfRowsInSection"); 
    return [self.assignments count]; 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    NSLog(@"cellForRowAtIndexPath"); 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"AssignmentCell"]; 
    if(cell == nil) { 
     cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"AssignmentCell"]; 
    } 
    cell.textLabel.text = [[self.assignments objectAtIndex:indexPath.row] title]; 
    return cell; 
} 

@end 
выход консоли

когда AssignmentsViewController загружен и по крайней мере один домашнее задание в массиве заданий:UITableViewController не будет вызывать cellForRowAtIndexPath НО numberOfSectionsInTableView и numberOfRowsInSection действительно установлены правильно

2013-11-06 18:55:09.396 Homework Planner[4756:70b] viewDidLoad 
2013-11-06 18:55:09.403 Homework Planner[4756:70b] numberOfSectionsInTableView 
2013-11-06 18:55:09.405 Homework Planner[4756:70b] numberOfRowsInSection 
2013-11-06 18:55:09.408 Homework Planner[4756:70b] viewWillAppear 
2013-11-06 18:55:09.409 Homework Planner[4756:70b] numberOfSectionsInTableView 
2013-11-06 18:55:09.409 Homework Planner[4756:70b] numberOfRowsInSection 

Я делаю заявление который отображает задания домашних заданий пользователей. По какой-то причине cellForRowAtIndexPath никогда не вызывается, даже когда я уверен, что в массиве присваивания есть объект задания homework. Назначения домашней работы добавляются в массив модальным представлением, и я убедился, что они действительно добавлены этим процессом, и после того, как пользователь отменил «отмену», представление возвращается к представлению, определенному этим классом. Когда это происходит, другие два метода, связанные с запуском UITableView, но не cellForRowAtIndexPath. Пожалуйста, помогите мне решить эту проблему, которую у меня есть.

+0

Вы подключили свой табличный вид к делегату и источнику данных? –

+0

@ hussain Shabbir да, я сделал. Он подключен в редакторе раскадровки и asa-протоколе в AssignmentsViewController.h. – ahyattdev

ответ

6

Проверьте, чтобы увидеть, если [self.assignments count] возвращается 0 (проверьте, если self.assignments является nil.

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 
    NSLog(@"[self.assignments count] = %d", [self.assignments count]); 
} 

В противном случае, только другая причина, я могу думать прямо сейчас, когда высота возвращается методом делегата является 0 (в случае вы реализуете его, в противном случае по умолчанию реализация всегда не дает отличной от нуля высоты, так не проблемы в этом случае)

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    CGFloat height = 0; 
    // Some calculation to determine height of row/cell. 

    return height; 
} 
+0

. Вы правы, когда я запускаю счет после предположения о добавлении домашнего объекта, он возвращает 0. Массив назначений - одноэлементный. Woudl, которые вызывают проблему того, что вещи не добавляются должным образом? – ahyattdev

+0

Теперь я знаю, что вызывает проблему, не могли бы вы пойти на дополнительные 10% и помочь мне решить новую проблему. – ahyattdev

+0

Вот остальная часть кода. Я уверен, что это поможет выявить проблему. Спасибо! http://pastebin.com/wGrLwkdu – ahyattdev

6

Позволь мне внести свой вклад еще один виновник:.. «проблему управления памятью»

Если объект DataSource Tableview не хранится (сохранить счетчик равен нулю), а TableView вытягивает из него данные, а затем, на удивление, Tableview: cellForRowAtIndexPath: не называется, хотя NumberOfSections и numberOfRows сделать только дозвонились

1

Если cellForRowAtIndexPath является не вызывайте его, потому что представление еще не отображается на экране (не показано), поэтому система не может знать размер ячейки или UITableView.

Чтобы решить эту проблему, убедитесь, что вы добавили свои элементы ПОСЛЕ просмотра, если визуализированы (и размеры известны). Это может произойти, если UITableView добавлен в родительском представлении для создания сложного экрана.

Если вы не загружаете данные во время фазы инициализации, вы можете вызвать reloadData после установки данных.

Пример:

OfferTableViewController * offerList = [[OfferTableViewController alloc] init]; 

// add the view in the parent view to make sure that the dimension are calculated 
[fullSiteView.offersView addSubview: offerList.view]; 
offerList.delegate = self; 
// Set the data 
offerList.offers = product.offers; 
// Force reload to render 
[offerList.tableView reloadData]; 

Кроме того, если вы перезаписать heightForRowAtIndexPath убедитесь, что это что-то вернуть> 0

Обратите внимание, что даже если numberOfRowsInSection и numberOfSectionsInTableView вернуть правильное количество элементов, если размер таблица неизвестна, система не будет звонить cellForRowAtIndexPath

1

Другой проблемой может быть кадр самого вида таблицы, имеющий размер 0 или находящийся вне экрана ...

я застрял на века смотреть журналы numberOfRowsInSection: Называние и heightForRowAtIndexPath: который вызывается и возвращающих жёстко прописанные значение, но cellForRowAtIndexPath: никогда не называли!

Попробуйте вывести рамку таблицыView или установить цвет фона на ней, чтобы проверить ее фактически отображаемый на экране.

Смежные вопросы