14

以下は、私が現在実行しているコードです。ナビコントローラーとテーブルビューコントローラーとビューコントローラーを備えたストーリーボードのセットアップがあります。テーブル用にセットアップした NSDictionary から詳細ビュー コントローラーに名前を渡そうとしています。prepareforsegue または didselectrowatindexpath を使用する必要がありますか?辞書から名前を取得して渡すにはどうすればよいですか?

#import "FMInboxViewController.h"
#import "FMDetailViewController.h"

@interface FMInboxViewController ()

@end

@implementation FMInboxViewController

@synthesize keyArray;
@synthesize tableArray;
@synthesize tblDictionary;
@synthesize filteredArray;

- (void)viewDidLoad
{
    [super viewDidLoad];

    NSMutableArray *ary=[[NSMutableArray alloc]init];
    [ary addObject:@"Adam"];
    [ary addObject:@"Fred"];
    [ary addObject:@"Angel"];
    // ... many similar entries
    [ary addObject:@"James"];
    [ary addObject:@"Mukthesh"];

    self.tblDictionary =[self fillingDictionary:ary];
}

テーブル ビュー データ ソース

#pragma mark - Table view data source

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
    // Return the number of sections.
    return [keyArray count];
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    // Return the number of rows in the section.
    NSArray *ary = [self.tblDictionary valueForKey:[keyArray objectAtIndex:section]];
    return [ary count];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath];

    NSString *key = [keyArray objectAtIndex:[indexPath section]];
    NSArray *array = (NSArray *)[self.tblDictionary valueForKey:key];
    NSString *cellTitle = [array objectAtIndex:[indexPath row]];
    cell.textLabel.text = cellTitle;

    // Configure the cell...

    return cell;
}

-(NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
    NSString *title = [keyArray objectAtIndex:section];
    return title;
}

//-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
//    NSString *key = [keyArray objectAtIndex:[indexPath section]];
//    NSArray *array = (NSArray *)[self.tblDictionary valueForKey:key];
//    self.selectedName = [array objectAtIndex:indexPath.row];
//    NSLog(@"Selected Name in Did select: %@", self.selectedName);
//    
//    [self performSegueWithIdentifier:@"showDetail" sender:self];
//}

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if ([segue.identifier isEqualToString:@"showDetail"]) {
        NSIndexPath *section = [self.tableView indexPathForSelectedRow];
        NSString *key = [keyArray objectAtIndex:section];
        NSArray *array = (NSArray *)[self.tblDictionary valueForKey:key];
        NSString *cellTitle = [array objectAtIndex:[indexPath row]];
        NSLog(@"Selected Name in Did select: %@", self.selectedName);
    }
}

ヘルパー メソッド

#pragma mark - Helper Methods

- (NSMutableDictionary *)fillingDictionary:(NSMutableArray *)sentArray {
    keyArray = [[NSMutableArray alloc] init];
    [keyArray removeAllObjects];
    NSMutableDictionary *dic = [[NSMutableDictionary alloc] init];
    [sentArray sortUsingSelector:@selector(compare:)];
    for ( NSString *str in sentArray) {
        NSString *charVal = [str substringToIndex:1];
        NSString *charStr = [NSString stringWithString:charVal];
        NSLog(@" charStr = %@", charStr);
        if (![keyArray containsObject:charStr]) {
            NSMutableArray *charArray = [[NSMutableArray alloc] init];
            [charArray addObject:str];
            [keyArray addObject:charStr];
            [dic setValue:charArray forKey:charStr];
        }
        else {
            NSMutableArray *prevArray = (NSMutableArray *)[dic valueForKey:charStr];
            [prevArray addObject:str];
            [dic setValue:prevArray forKeyPath:charStr];
        }
    }

    return dic;
}


@end

OK、そのセクションを次のように変更しました

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    NSString *key = [keyArray objectAtIndex:[indexPath section]];
    NSArray *array = (NSArray *)[self.tblDictionary valueForKey:key];
    self.selectedName = [array objectAtIndex:indexPath.row];
    NSLog(@"Selected Name in Did select: %@", self.selectedName);
}

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    FMDetailViewController *dvc = (FMDetailViewController *)segue.destinationViewController;
    dvc.name = self.selectedName;
}

ただし、行を選択すると、最初のプレスで名前が詳細コントローラーに表示されません。戻って別の名前を選択すると、最初に押した名前がView Controllerに表示されます。これが発生する理由について何か提案はありますか?

4

4 に答える 4

33

両方を使用する必要がありdidSelectRowAtIndexPathます。呼び出す必要があります[self performSegueWithIdentifier:@"identifier" sender:self];

同じView Controllerで、セグエからprepareForSegueメソッドを取得し、そのView ControllerdestinationViewControllerで設定したいプロパティを設定する必要があります。

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    self.someProperty = [self.someArray objectAtIndex:indexPath.row];
    [self performSegueWithIdentifier:@"segueID" sender:self];
}

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    UIViewController *vcToPushTo = segue.destinationViewController;
    vcToPushTo.propertyToSet = self.someProperty;
}
于 2013-11-19T15:10:42.650 に答える
28

可能であれば (これはほとんどすべての標準的なシナリオに当てはまります)、Interface Builder を使用してセグエをトリガーします。prepareForSegue:宛先のView Controllerを構成するには、まだ実装する必要があります。

セルまたはアクセサリ ボタン (セルの一番右側) をタップしたときに詳細ビューをトリガーする IB でセグエを作成するには、次の手順を実行します。

  1. Table View Cell から目的の View Controller へのドラッグを制御し、マウスまたはトラックパッドを離します。これにより、小さな選択パネルが開きます。

  2. トリガーのソース (「セレクション セグエ」または「アクセサリ アクション」) と、セグエのタイプ (「プッシュ」、「モーダル」、または「カスタム」) を選択します。

  3. Attributes Inspector ペインで、セグエの「識別子」を定義します (「UserShowSegue」など)。

これは、詳細ビュー コントローラへの「プッシュ」セグエをトリガーするために「ユーザー」ビュー コントローラの「テーブル ビュー セル」がどのように設定されているかを示す IB のデモ ストーリーボードの画像です。

ここに画像の説明を入力

于 2013-11-19T16:31:44.520 に答える
2

didSelectRowAtIndexPathストーリーボードのビジュアル プログラミングに置き換えることができるため、次のprepareForSegueようにすべてのロジックを実行することをお勧めします。

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
    let cell = sender as! UITableViewCell
    let indexPath = tableView.indexPath(for: cell)!
    ... and then use indexPath to set up the destination
}
于 2016-06-13T14:42:25.667 に答える