0

UITableViewplistファイルからの表示データがあります。このテーブルビューでNSArrayは、plistファイルの内容からを作成し、データを各セルにフィードしました。ただし、セルがタップされると、次のテーブルビューコントローラーがタップされたセルのインデックスパスを認識し、このビューコントローラーが配列内の詳細を表示するアイテムを認識できるようにする必要があります。私は次の方法を試しました:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    staffDetailView = [[StaffDetailViewController alloc] init];
    [staffDetailView setSelectedIndexPath:indexPath];

    [self performSegueWithIdentifier:@"pushStaffDetailView" sender:self];
    [tableView deselectRowAtIndexPath:indexPath animated:YES];
}

上記では、タップしたセルのインデックスパスをNSIndexPath、新しいViewControllerで作成したオブジェクトに渡そうとしています。

次のテーブルビューコントローラのヘッダーファイル:

@interface StaffDetailViewController : UITableViewController {

    NSIndexPath *selectedIndexPath;
    NSArray *staffArray;

}

@property (nonatomic, retain) NSIndexPath *selectedIndexPath;
@property (nonatomic, strong) NSArray *staffArray;

ここでselectedIndexPathは、前のViewControllerで設定されたオブジェクトを定義します。

しかしselectedIndexPath、関連データを表示するためにオブジェクトにアクセスしようとすると、オブジェクトは次のように見えますnil

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
    NSString *header;
    if (section == 0) {
        NSString *name = [[staffArray objectAtIndex:selectedIndexPath.row] objectForKey:@"Staff Member"];
        NSArray *splitStaffArray = [name componentsSeparatedByString:@", "];
        NSString *lastName = [splitStaffArray objectAtIndex:0];
        NSString *firstName = [splitStaffArray objectAtIndex:1];
        NSString *consolidatedName = [NSString stringWithFormat:@"%@ %@", firstName, lastName];
        NSString *assignment = [[staffArray objectAtIndex:selectedIndexPath.row] objectForKey:@"Assignment"];
        header = [NSString stringWithFormat:@"%@\n%@", consolidatedName, assignment];
        return header;
    }
    return nil;
}

selectedIndexPathオブジェクトに正しくアクセスしていませんか?正しいインデックスパスを次のViewControllerに渡すための優れた方法はありますか?

4

2 に答える 2

0

最初のテーブルビューコントローラのdidSelectRowAtIndexPathメソッドを改訂しました。

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

    [self performSegueWithIdentifier:@"pushStaffDetailView" sender:self];
    [tableView deselectRowAtIndexPath:indexPath animated:YES];

    [staffDetailView setSelectedIndexPath:indexPath];
    [staffDetailView setPassedName:[[staffArray objectAtIndex:indexPath.row] objectForKey:@"Staff Member"]];   

}

何らかの理由で、そのビューコントローラのインスタンス変数にアクセスする前にセグエを実行する必要があるように見えました。alloc initビューコントローラーだけではうまくいかなかったのは不思議です。とにかく、インデックスパスはViewController間で正しくプッシュされています。

于 2012-03-13T21:08:54.677 に答える
-3
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    //I ll use NSUserDefaults to store tha indexpath. Indexpath.row is an int property, so convert to NSNumber 

    NSNumber *ip = [NSNumber numberWithInt:indexpath.row];
    NSUserDefaults *saveIP=[NSUserDefaults standartuserdefaults];
    [saveIP setObject: ip foKey:@"theIndexPath"];

    [self performSegueWithIdentifier:@"pushStaffDetailView" sender:self];
    [tableView deselectRowAtIndexPath:indexPath animated:YES];

    [staffDetailView setSelectedIndexPath:indexPath];
    [staffDetailView setPassedName:[[staffArray objectAtIndex:indexPath.row] objectForKey:@"Staff Member"]];   

}

他のViewControllerは、以下のコードで保存されたオブジェクト(データ)を取得します

NSNumber *theIndexpath= [[NSUserDefaults standartuserdefaults] objectForKey:@"theIndexPath"];

注:NSUserDefaultsは良い考えではないかもしれませんが、それは非常に簡単で、私のアプリでも機能します

于 2012-02-20T21:59:29.303 に答える