5

UItableViewCell アクセサリ ボタンに問題があります。私のアクセサリ ボタンは、別の UIViewController へのセグエで「接続」されています。アクセサリ ボタンをタップすると、モデルからオブジェクトが取得され、このオブジェクトがセグエの destinationViewController に「渡されます」。これは、セグエメソッドの準備です。

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([segue.identifier isEqualToString:@"IdentityCard"])
    {
        NSLog(@"%i" ,self.tableView.indexPathForSelectedRow.row);
        [segue.destinationViewController showIdentityCardForTeacher:[self.teachers getTeacherInPosition:self.tableView.indexPathForSelectedRow.row]];
    }
}

問題は、メソッドの先頭 (「if」の後) の NSLog が常に数値 0 を表示することです! メソッドを実装しようとしました:

-(void)tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath

しかし、このメソッドの前に segue メソッドの準備が実行されるため、indexPath を「保存」するための @property を設定できません。どうすればこの問題を解決できますか?

4

3 に答える 3

1

私はこの方法で問題を解決します: UIViewController を destinationViewController に接続しました (アクセサリ ボタンからではなく、UIViewController から)。

最初のビュー コントローラーで @property を作成しました。

@property (nonatomic) NSInteger indexPathRow;

次に、次のようにコードを変更しました。

-(void)tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath
{
    NSLog(@"Disclosure Tapped----> %i" ,indexPath.row);
    self.indexPathRow = indexPath.row;
    [self performSegueWithIdentifier:@"IdentityCard" sender:self];
}

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([segue.identifier isEqualToString:@"IdentityCard"])
    {
        NSLog(@"%i" ,self.tableView.indexPathForSelectedRow.row);
        [segue.destinationViewController showIdentityCardForTeacher:[self.teachers getTeacherInPosition:self.indexPathRow]];
    }
}

今それは動作します!

于 2012-11-22T17:23:37.363 に答える
0

@Andresの解決策は私にとってはうまくいきますが、追加ボタンをナビゲーションバーに追加し、同じセグエ識別子を持つ同じビューコントローラーを表示したい場合index = [self.tableView indexPathForCell:sender].row;、送信者はUITableViewCellのサブクラスではないため、コードは機能しません。@Andresコードを使用した私のソリューションは次のとおりです。

- (void) addItem: (id) sender {
    [self performSegueWithIdentifier: @"Identifier" sender: self];
}

- (void) prepareForSegue: (UIStoryboardSegue *) segue sender: (id) sender {
    id selectedObject;
    if (![[sender class] isSubclassOfClass: [UITableViewCell class]]) {
        // create a new object
        selectedObject = [...];
    }
    else {
        selectedObject = [objectArray objectAtIndex: [self.tableView indexPathForCell: sender].row];
    }

    if ([[segue identifier] isEqualToString: @"Identifier"]) {
        // use the new or existing object
        [selectedObject doSonething];
    }
}
于 2015-05-29T10:55:18.653 に答える