如何设置UITableViewCell的子类?

dhr*_*hrm 5 cocoa-touch objective-c uitableview ios

我已经创建了UITableViewCell的子类.到目前为止,我只使用在我的故事板中"设计"的单元格,我可以在其中设置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;
    }
}
Run Code Online (Sandbox Code Playgroud)

在我创建了UITableViewCell的子类之后,我不再能够使用Storyboard为自定义单元格创建segues,对吧?我试图在故事板中创建一个单元格并将其类设置为我的自定义类 - 但是当我运行应用程序时,单元格只是空白.

所以我只是在我的分配和初始化自定义单元格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;
}
Run Code Online (Sandbox Code Playgroud)

然后,tableView:didSelectRowAtIndexPath我正在尝试创建NewsViewController,设置新闻项并将其推送到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];
}
Run Code Online (Sandbox Code Playgroud)

但是当我选择一行时,我的NewsViewController没有显示 - 而是我看到一个黑色背景的空白视图.我怎么处理这个?是否仍然可以使用seques?

bar*_*ley 3

我认为问题是您正在使用alloc-init实例化NewsViewController. 这不会NewsViewController从故事板创建你的。您必须使用[UIStoryboard instantiateViewControllerWithIdentifier:(NSString *)identifier]故事板来实例化。

不过,我认为更简单的方法是打电话

[self performSegueWithIdentifier:@"showNews" sender:indexPath] 
Run Code Online (Sandbox Code Playgroud)

在你的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;
    }
}
Run Code Online (Sandbox Code Playgroud)