15

私はUITableView1つのセクションといくつかの行で単純にしました。ユーザーがセルアクセサリボタン(に接続されていdetailsSegueます。セルの行が何であるかを知りたいのですが。配列から適切なオブジェクトを選択し、次のビューから変数に割り当てることができます)をクリックしたとき。

デリゲートメソッドを使用tableview:accessoryButtonTappedForRowWithIndexPath:し、indexPath値をプライベートプロパティに割り当てましたmyRowprepareForSegue:sender:メソッドよりも、self.myRow.row値を使用して配列から適切なオブジェクトを選択しました。

私の問題は、これら2つのメソッドが間違った順序で実行されているように見えることです。NSLogから、prepareForSegue:sender:メソッドが最初に実行され、デリゲートメソッドがself.myRowその後の値を変更していることがわかります。

したがって、prepareForSegue:sender:メソッドは常に間違ったオブジェクトを次のビュー(以前にタップされたビュー)に渡します。

私の英語の人に申し訳ありません。よろしくお願いします。

-(void)tableView:(UITableView *)tableView accessoryButtonTappedForRowWithIndexPath:(NSIndexPath *)indexPath {
    self.myRow = indexPath;
    NSLog(@"tapped button at row: %i",self.myRow.row); 
}

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    if([segue.identifier isEqualToString:@"addSegue"]) {
        AddViewController *avc = segue.destinationViewController;
        avc.delegate = self;
    }
    else if ([segue.identifier isEqualToString:@"detailsSegue"]) {
        NSLog(@"Segue row: %i",self.myRow.row);
        Annotation *annotation = [self.viewsList objectAtIndex:self.myRow.row];
        NSLog(@"Segue annotation object: %@",annotation.title);
        DetailsViewController *dvc = segue.destinationViewController;
        dvc.wikiKey = annotation.title;
    }
}
4

4 に答える 4

42

お気づきのように、システムはメッセージを送信するprepareForSegue:sender:にメッセージを送信します。tableview:accessoryButtonTappedForRowWithIndexPath:

ただしprepareForSegue:sender:、メッセージを送信するとき、sender引数はUITableViewCellアクセサリ ビューを含む です。これを使用して、どの行のアクセサリ ボタンがタップされたかを判断できます。

else if ([segue.identifier isEqualToString:@"detailsSegue"]) {
    NSIndexPath *indexPath = [self.tableView indexPathForCell:sender];
    Annotation *annotation = [self.viewsList objectAtIndex:indexPath.row];
    DetailsViewController *dvc = segue.destinationViewController;
    dvc.wikiKey = annotation.title;
}
于 2012-12-03T19:41:41.080 に答える
2

差出人はアクセサリーボタンになりますよね?その場合、スーパー ビューを上に移動してそのセルを含むセルを見つけ、そのセルのインデックス パスを取得できるはずです。最初の部分を実行するために、以前にこのような方法を使用しました。

+ (UITableViewCell *)findParentCellOfView:(UIView *)view {
  if (view == nil || [view isKindOfClass:[UITableViewCell class]]) {
    return (UITableViewCell *)view;
  }
  return [self findParentCellOfView:[view superview]];
}
于 2012-12-03T19:41:10.673 に答える
2

// シンプルで優れた簡単なオプションを教えてください :-

// 解決策 :- tableView のこのメソッドでアクセサリ ビューのボタンにタグを割り当てることができます

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    // set accessory view
    UIButton *oValidHomeAccessryBtn = [UIButton buttonWithType:UIButtonTypeCustom];

    // set target of accessory view button
    [oValidHomeAccessryBtn addTarget:self action:@selector(AccessoryAction:) forControlEvents:UIControlEventTouchUpInside];

    // set tag of accessory view button to the row of table
    oValidHomeAccessryBtn.tag =indexPath.row;

    // set button to accessory view
    cell.accessoryView = oValidHomeAccessryBtn ;
}

// セレクターに渡したメソッドを作成し、タグ値を取得すると、クリックされたアクセサリ ビューの indexPath が取得されます

- (void)AccessoryAction:(id)sender
{
    NSLog(@"%d",[sender tag]);
}

これは、アクセサリ ビューをクリックした行の indexPat を取得する最も簡単な方法です。

于 2013-10-11T07:30:42.397 に答える
-3

あなたがする必要があるのはsegue、デリゲートメソッドからプログラムで呼び出すことです。segueストーリーボードを使用していると仮定すると、ストーリーボードとデリゲート メソッドの使用でのリンクを解除する必要があります。

[self performSegueWithIdentifier: @"IdentifierNameHere" sender: self];
于 2012-12-03T19:18:48.883 に答える