4

UIAlertView実際にセルを削除する前に表示しようとしていますUITableView

NSIndexPath *_tmpIndexPath;


- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
{
    if(editingStyle == UITableViewCellEditingStyleDelete)
    {
        _tmpIndexPath = indexPath;

         NSLog(@"%d", indexPath.row); // 2
         NSLog(@"%d", _tmpIndexPath.row); // 2

        UIAlertView *alert = [[[UIAlertView alloc] initWithTitle:@"Dete" message:@"Are you sure you want to delete this entry?" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"Ok", nil] autorelease];
        [alert show];
    }
}

したがって、両方のログが正しいパスを返します。

UIAlertViewを委任するビューがあります

- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
    NSLog(@"%d", _tmpIndexPath.row);
    if(buttonIndex == 1)
    {
        NSLog(@"%d", _tmpIndexPath.row);
    }
}

clickButtonAtIndex()ログに記録しようとするとエラーが発生する理由がわかりません_tmpIndexPath.row

 *** -[NSIndexPath row]: message sent to deallocated instance 0x12228e00
4

5 に答える 5

5

indexPathを保持する必要があります。何が起こっているのかというと、アラートが閉じられたときのindexPathは、システムから既に割り当て解除されています。

このような

変化する

_tmpIndexPath = indexPath;

_tmpIndexPath = [indexPath retain];
于 2012-06-18T08:50:37.990 に答える
3

あなたはこれを試みることができます

        UIAlertView *alert = [[[UIAlertView alloc] initWithTitle:@"Dete" message:@"Are you sure you want to delete this entry?" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"Ok", nil] autorelease];
[alert setTag:indexPath.row];
        [alert show];

したがって、次のように値を取得できます

[alertView tag]

clickedButtonAtIndex

于 2012-06-18T08:57:31.527 に答える
1

NSIndexPathはでNSObjectあり、メソッドで自動解放されるtableView: commitEditingStyleため、インスタンス変数_tmpIndexPath = indexPath;に割り当てます。後で割り当てが解除されます。あなたがする必要があるのは: しかしあなたがそれを再び設定する前に_tmpIndexPath = [indexPath copy];あなたがあなたを解放する責任があるので注意してください。_tmpIndexPathよりクリーンな解決策は、プロパティを使用することです。

@property (nonatomic, copy) NSIndexPath *tmpIndexPath;
...
self.tmpIndexPath = indexPath; 
于 2012-06-18T08:54:34.197 に答える
1

上記の技術的な回答を認めて、これは実際には必要ないことを示唆できますか。テーブルビューからアイテムを削除する通常の方法(編集ボタンを押して行をスワイプする)を使用している場合、フローに確認を追加すると、テーブルの動作を人々が期待する方法と矛盾します。ユーザーは、削除機能にアクセスする前に、すでにタップ(またはスワイプ)する必要があるため、ユーザーはそれを実行したいことをすでにかなり確信している必要があります。

于 2012-06-18T08:58:52.513 に答える
0

ARCを使用していますか?そうでない場合は、_tmpIndexPath =[indexPathretain];を試してください。後でリリースすることを忘れないでください

于 2012-06-18T08:52:04.120 に答える