Как сохранить подкласс UITableViewCell? - PullRequest
5 голосов
/ 01 февраля 2012

Я создал подкласс UITableViewCell . До сих пор я использовал только те ячейки, которые «разработаны» в моей раскадровке, где я могу настроить сегменты.

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    [super prepareForSegue:segue sender:sender];

    NSIndexPath *indexPath = [self.tableView indexPathForCell:sender];

    if ([[segue identifier] isEqualToString:@"showNews"]) {
        NewsViewController *newsViewController = [segue destinationViewController];
        News *news = (News*)[self.fetchedResultsController objectAtIndexPath:indexPath];
        newsViewController.news = news;
    }
}

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

Так что вместо этого я просто размещаю и запускаю пользовательскую ячейку в моем tableView:cellForRowAtIndexPath:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"WSTableViewCell";

    WSTableViewCell *cell = (WSTableViewCell*)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[WSTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }

    WSObject *item = [self.fetchedResultsController objectAtIndexPath:indexPath];
    [cell.titleLabel setText:item.title];

    return cell;
}

Затем в tableView:didSelectRowAtIndexPath Я пытаюсь создать элемент управления NewsViewController, настроить элемент новостей и отправить его навигатор контроллера:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
    News* news = [self.fetchedResultsController objectAtIndexPath:indexPath];
    NewsViewController *newsViewController = [[NewsViewController alloc] init];
    newsViewController.news = news;
    [[self navigationController] pushViewController:newsViewController animated:YES];
}

Но когда я выбираю строку, мой NewsViewController не отображается - вместо этого я вижу пустой вид с черным фоном. Как я могу справиться с этим? Можно ли все еще использовать seques?

1 Ответ

3 голосов
/ 01 февраля 2012

Я думаю, что проблема в том, что вы используете alloc-init для создания экземпляра NewsViewController. Это не создает ваш NewsViewController из раскадровки. Вы должны использовать [UIStoryboard instantiateViewControllerWithIdentifier:(NSString *)identifier] для создания экземпляра из раскадровки.

Тем не менее, я думаю, что проще позвонить

[self performSegueWithIdentifier:@"showNews" sender:indexPath] 

в вашем didSelectRowAtIndexPath. Вы должны немного изменить свой prepareForSegue....

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    NSIndexPath *indexPath = (NSIndexPath *)sender;

    if ([[segue identifier] isEqualToString:@"showNews"]) {
        NewsViewController *newsViewController = [segue destinationViewController];
        News *news = (News*)[self.fetchedResultsController objectAtIndexPath:indexPath];
        newsViewController.news = news;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...