Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to seque a subclass of UITableViewCell?

I've created a subclass of UITableViewCell. Until now, I've only been using cells which is "designed" in my storyboard where I can setup segues.

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

After I've created my subclass of UITableViewCell I'm no longer able to use the Storyboard to create segues for the custom cell, right? I've tried to create a cell in the storyboard and set its class to my custom class -- but then the cell is just blank when I run the App.

So instead I'm just alloc and init the custom cell in my 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;
}

Then in tableView:didSelectRowAtIndexPath I'm trying to creating the NewsViewController, setting the news item and push it to the navigationController:

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

But when I select a row my NewsViewController is not shown -- but instead I see a blank view with a black background. How can I deal with this? Is it possible to still use seques?

like image 916
dhrm Avatar asked Oct 23 '22 10:10

dhrm


1 Answers

The problem I think is that you are using alloc-init to instantiate NewsViewController. That does not create your NewsViewController from storyboard. You have to use [UIStoryboard instantiateViewControllerWithIdentifier:(NSString *)identifier] to instantiate from storyboard.

However, I think the easier way is to call

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

in your didSelectRowAtIndexPath. You have to change your prepareForSegue... a little bit.

- (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;
    }
}
like image 121
barley Avatar answered Nov 01 '22 13:11

barley