2012-02-01 6 views
5

のサブクラスを作成しました。UITableViewCellです。今までは、私がセグメントを設定できるストーリーボードで「設計」されたセルしか使用していませんでした。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の私のサブクラスを作成した後、私は、もはや右、カスタムセルのseguesを作成するためにストーリーボードを使用することができますよ!私はストーリーボードにセルを作成し、そのクラスを自分のカスタムクラスに設定しようとしましたが、アプリケーションを実行するとセルは空白になります。

はので、代わりに私はただの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が示されていない - 代わりに、私は黒い背景の空のビューを参照してください。私はこれにどのように対処できますか?それでもそれは可能ですか?

答えて

3

NewsViewControllerをインスタンス化するためにalloc-initを使用していると思います。ストーリーボードからあなたのNewsViewControllerは作成されません。ストーリーボードからインスタンス化するには、[UIStoryboard instantiateViewControllerWithIdentifier:(NSString *)identifier]を使用する必要があります。

しかし、私は簡単な方法は、あなたのdidSelectRowAtIndexPath

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

を呼び出すことだと思います。 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

+0

なぜ 'super'コールが必要ないのですか? –

+1

あなたは '[super prepareForSegue:...]'を意味しますか?私はあなたがそれを行う必要はないと思うb/c 'UIViewController'の実装は何もしません。あなた自身の 'UIViewController'サブクラスをサブクラス化し、その' prepareForSegue'実装も使いたい場合は、その時に 'super'を呼び出さなければなりません。 – barley

関連する問題