2012-02-01 51 views
5

我已经创建了的子类UITableViewCell。到目前为止,我只使用在故事板中“设计”的单元,在那里我可以设置segues。如何seque 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的子类,我不再能够使用故事板创建自定义单元格塞格斯,右后?我试图在故事板中创建一个单元格,并将其类设置为我的自定义类 - 但是,当我运行该应用程序时,该单元格只是空白。

所以不是我只是alloc和我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,设置新闻项目,并将它推到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]; 
} 

但是,当我选择一行我的NewsViewController没有显示 - 但相反,我看到一个黑色背景的空白视图。我该如何处理这个问题?是否仍然可以使用seques?

回答

3

我认为的问题是,您正在使用alloc-init实例NewsViewController。这不会从storyboard创建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; 
    } 
} 
+0

谢谢你的解决方案! – dhrm 2012-02-01 14:23:21

+0

为什么不需要“超级”呼叫? – 2013-10-02 18:41:06

+1

你的意思是'[超级准备赛:']'?我认为你不必这样做b/c UIViewController的实现没有任何作用。如果你继承自己的'UIViewController'子类,并且想要使用它的'prepareForSegue'实现,那么你必须在那个时候调用'super'。 – barley 2013-10-02 19:53:45

相关问题