2012-03-13 8 views
2

私は自分のTableViewで選択した行iに従ってDetailViewControllerにデータを送信しようとしています。私のプロジェクトはStoryBoardで作られています。didSelectedRowAtIndexPath - prepareForSegue - ストーリーボード

マイTableViewCellがよく私のMainStoryBoardの私のUIViewにリンクされている、すべてが正常に私は私のDetailViewここ

に選択された行の情報を送信する方法を知らないことを期待している私が持っているものです。

「:送信者:performSegueWithIdentifier」
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 

{ 
    NSUInteger section = [indexPath section]; 
    NSUInteger row = [indexPath row]; 
    NSUInteger oldRow = [lastIndexPath row]; 
    NSString *key = [keys objectAtIndex:section]; 
    detailRow = [names objectForKey:key]; 
    static NSString *SectionsTableIdentifier = @"SectionsTableIdentifier"; 

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:SectionsTableIdentifier]; 
    if (cell == nil) 
    { 
     CGRect cellFrame = C 

GRectMake(0, 0, 300, 65); 
     cell = [[UITableViewCell alloc] initWithFrame:cellFrame] ; 
    } 
    CGRect nameLabelRect = CGRectMake(200, 5, 200, 15); 
    UILabel *nameLabel = [[UILabel alloc] initWithFrame:nameLabelRect]; 
    nameLabel.tag = kNameValueTag; 
    [cell.contentView addSubview: nameLabel]; 

    UILabel *name = (UILabel *)[cell.contentView viewWithTag:kNameValueTag]; 
    name.text = [[detailRow objectAtIndex:row] valueForKey:@"name"]; 

    cell.imageView.image = [UIImage imageNamed:[[detailRow objectAtIndex:row] valueForKey:@"image"]]; 

    cell.accessoryType = (row == oldRow && lastIndexPath != nil) ? 
     UITableViewCellAccessoryCheckmark : UITableViewCellAccessoryNone; 

    return cell; 
} 



- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 

    [self performSegueWithIdentifier:@"DetailGrandComptes" sender:self]; 
} 



    - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
    { 

    if ([[segue identifier] isEqualToString:@"DetailGrandComptes"]) 
    { 

     // HERE IS WHERE THE CODE SHOULD BE I GUESS.... !! I HAVE TO DISPLAY AN UIIMAGEVIEW + UILABEL + UIIMAGEVIEW 

    } 

} 

答えて

9

呼び出す 代わりに、送信者に自己を渡すのは、後から必要な情報を渡す(つまり、どちらかindexPath、またはindexPathによって表されるモデルのオブジェクト) 後半prepareForSegue中(中にあなたif)あなたは、先に渡したオブジェクトに送信側パラメータをキャストできます。 [segue destinationViewController]で宛先ビューコントローラを取得できます。あなたは先のビューコントローラ上のいくつかのプロパティを設定することができます。この時点で、 ..

そう...

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    [self performSegueWithIdentifier:@"DetailGrandComptes" sender:indexPath]; 
} 
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 

if ([[segue identifier] isEqualToString:@"DetailGrandComptes"]) 
{ 
    MyViewController *destination = [segue destinationViewController]; 
    NSIndexPath * indexPath = (NSIndexPath*)sender; 
    destination.imageName = [[detailRow objectAtIndex:indexPath.row] valueForKey:@"image"] 
    destination.nameString = .... 
} 

EDIT(画像などのように):あなたの「DetailGrandComptes」クラスのプロパティまたはアイバーズを持つべきですあなたが必要です! ..だからあなたはラベルと画像が必要な場合は、あなたのクラスは次のようにする必要があります:

@interface DetailGrandComptes : UIViewController 

@property (strong, nonatomic) NSString *imageName; 
@property (strong, nonatomic) NSString *nameString; 

@end 

//in you .m 
@interface DetailGrandComptes() 
@property (weak, nonatomic) IBOutlet UIImageView *image; 
@property (weak, nonatomic) IBOutlet UILabel *name; 
@end 

@implementation DetailGrandComptes 

- (void)viewWillAppear 
{ 
    [super viewWillAppear]; 
    name.text = nameString; 
    image.image = [UIImage imageNamed:imageName]; 
} 

@end 
+0

は、私はちょうど、私の答えを投稿ではなく、すべてのもの:P – user1256827

+0

@ user1256827私の答えの編集を参照してください... – Francesco

+1

このソリューションは、正しくprepareForSegueを使用していません。送信者は、他の情報ではなく、セグを開始するView Controllerでなければなりません。 prepareForSegueに達する前にdeselectRowAtIndexPathが呼び出されていないことを確認し、tableViewでindexPathForSelectedRowを使用できます。 – Johannes

0

また、先のビューコントローラがナビゲーションビューコントローラである場合。 は次のようになります。それの半分が動作するため、

MyViewController *destination = [[segue destinationViewController] topViewController]; 
関連する問題