2015-02-26 2 views
-1

UITableViewCells получить опустели на скроллинга (Objective-C)UITableViewCells получить опустели на скроллинга (ObjC)

У меня возникают проблемы с UITableViewCells получения опустели, как только я начало для прокрутки в виде таблицы.

Я уже посмотрел на Cells become empty after scrolling. (Xcode) - однако проблема все еще сохраняется.

1) У меня есть контроллер popover view, который представляет способ входа в систему администрирования. При успешном входе в систему (который еще не был реализован, кнопка LOGIN просто берет один прямо в тестовую таблицуView, которую позже следует подавать из некоторой внешней базы данных).

2) После успешного входа в систему имя пользователя входа в popover удаляется, и пользовательский UITableViewController входит в игру со своим XIB.

3) Этот UITableViewController использует пользовательский UITableViewCell - поскольку ячейки прототипа в этой конфигурации невозможно.

Все это работает до такой степени, что я прокручиваю таблицу - и все ячейки по какой-то причине опустели.

Вот код бежать вниз (я оставляю на очевидное, например, свойства и таблицы раздела и т.д. расстановок):

1) customPopUpViewController (XIB, .h, .m):

- (IBAction)loginButtonPressed:(UIButton *)sender { 
    UITableViewController *libraryTableViewController = [[LibraryAdminTableViewController alloc]initWithNibName:@"LibraryAdminTableViewController" bundle:nil]; 
    libraryTableViewController.view.frame = CGRectMake(0, 179, libraryTableViewController.view.frame.size.width, libraryTableViewController.view.frame.size.height); 
    [self.view addSubview:libraryTableViewController.view]; 
} 

2) LibraryAdminTableViewController (XIB, .h, .m):

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    self.LibraryAdminTable.delegate = self; 
    self.LibraryAdminTable.dataSource = self; 
    self.tblContentList = [[NSMutableArray alloc]init]; 
    self.tblContentList = [NSMutableArray arrayWithObjects:@"Sync Pack 1",@"Sync Pack 2",@"Sync Pack 3", nil]; 
    [self.LibraryAdminTable registerNib:[UINib nibWithNibName:@"LibraryAdminTableViewCell" bundle:[NSBundle mainBundle]] forCellReuseIdentifier:@"LibraryAdminCell"]; 
} 
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    LibraryAdminTableViewCell *cell = [self.LibraryAdminTable dequeueReusableCellWithIdentifier:@"LibraryAdminCell" forIndexPath:indexPath]; 
    NSString* trackList = [self.tblContentList objectAtIndex:indexPath.row]; 
    cell.cellLabel.text = trackList; 
    return cell; 
} 

3) LibraryAdminTableViewCell (XIB, .h, .m) - я дал идентификатор в инспектора Атрибуты «LibraryAdminCell»:

@property (strong, nonatomic) IBOutlet UILabel *cellLabel; 

Что мне не хватает?

+0

Не могли бы вы проверить, будет ли каждый раз, когда вызывается cellForRowAtIndexPath, на самом деле возвращается ячейка вместо нулевого? – TMob

+0

yep, у меня был этот первый, такая же проблема: LibraryAdminTableViewCell * cell = [tableView dequeueReusableCellWithIdentifier: @ "LibraryAdminCell"]; if (cell == nil) { cell = [[LibraryAdminTableViewCell alloc] initWithStyle: UITableViewCellStyleSubtitle reuseIdentifier: @ "LibraryAdminCell"]; cell.selectionStyle = UITableViewCellSelectionStyleNone; } – GermanGangsta

+0

Typecast вот так. LibraryAdminTableViewCell * cell = (LibraryAdminTableViewCell *) [tableView dequeueReusableCellWithIdentifier: @ "LibraryAdminCell"]; Это может быть проблемой.Поскольку первый раз вышеуказанный код инициализирует ячейку, но второй раз ее нужно повторно использовать. Поэтому попробуйте с этим. –

ответ

-1

Это происходит потому, что вы не создаете новую ячейку, когда tableview попытается удалить ячейку из ячейки, и она не получит ячейку, тогда она должна создать ячейку для использования, но вы не создаете какую-либо ячейку, поэтому она возвращается nil.Try код ниже


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 

    LibraryAdminTableViewCell *cell = (LibraryAdminTableViewCell*)[self.LibraryAdminTable dequeueReusableCellWithIdentifier:@"LibraryAdminCell" 
                               forIndexPath:indexPath]; 
    if (cell == nil) 
    { 
     cell = [[LibraryAdminTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault 
               reuseIdentifier:@"LibraryAdminCell"]; 

     cell.selectionStyle = UITableViewCellSelectionStyleNone; 
    } 
    NSString* trackList = [self.tblContentList objectAtIndex:indexPath.row]; 
    cell.cellLabel.text = trackList; 
    return cell; 
} 
+0

dequeueReusableCellWithIdentifier: Возвращаемое значение - Объект UITableViewCell с соответствующим идентификатором повторного использования. ** Этот метод всегда возвращает действительную ячейку. ** –

+0

К сожалению, я все еще сталкиваюсь с проблемой освобождения ячеек с указанным выше кодом. – GermanGangsta

+0

Сколько строк вы создаете? комментарий этой строки в вашем коде [self.LibraryAdminTable registerNib: [UINib nibWithNibName: @ "LibraryAdminTableViewCell" bundle: [NSBundle mainBundle]] forCellReuseIdentifier: @ "LibraryAdminCell"]; и попробуйте мой код, а также установите некоторый цвет фона на ярлыке вашей ячейки, и отметьте метки там или нет после прокрутки таблицы. – vivekDas

0

она решается. В соответствии с этим thread мне пришлось получить сильную ссылку на пользовательский UITableViewController через свойство в всплывающем контроллере, поскольку ViewController (являющийся DataSource для tableView) не будет сохранен в памяти.

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