0

テーブルビューにジェスチャ認識機能を設定しています。

  • 右にスワイプすると、アクセサリがダニの画像に変わります
  • 左にスワイプすると、シェブロン画像に変わります

セルをタップすると、ローカルのHTMLファイルが読み込まれます。

右にスワイプすると、チェックマークが表示されます。ただし、セルをタップしてHTMLファイルを表示し、テーブルビューに戻ると、画像は山形に戻ります。

ダニが正常にとどまるようにするための最良の方法は何ですか?


編集

さらなるコード:

'viewDidLoad'から:

UISwipeGestureRecognizer *recognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self
                                                                                 action:@selector(handleSwipeRight:)];
[recognizer setDirection:(UISwipeGestureRecognizerDirectionRight)];
[self.tableView addGestureRecognizer:recognizer];

recognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self
                                                       action:@selector(handleSwipeLeft:)];
//recognizer.delegate = self;
[recognizer setDirection:(UISwipeGestureRecognizerDirectionLeft)];
[self.tableView addGestureRecognizer:recognizer];


- (void)handleSwipeLeft:(UISwipeGestureRecognizer *)gestureRecognizer
{
//Get location of the swipe
CGPoint location = [gestureRecognizer locationInView:self.tableView];

//Get the corresponding index path within the table view
NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:location];

//Check if index path is valid
if(indexPath)
{
    //Get the cell out of the table view
    UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];

    //Update the cell or model

    cell.accessoryView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"disclosure.png"]];
}
}

- (void)handleSwipeRight:(UISwipeGestureRecognizer *)gestureRecognizer
{
CGPoint location = [gestureRecognizer locationInView:self.tableView];

NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:location];

if(indexPath)
{
    UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];

    // cell.accessoryType = UITableViewCellAccessoryCheckmark;
    cell.accessoryView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"tick.png"]];
}

}

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{

static NSString *simpleTableIdentifier = @"MFGCell";

MFGCell *cell = (MFGCell *) [tableView dequeueReusableCellWithIdentifier:simpleTableIdentifier];

if (cell == nil) {
    NSArray *nib = [[NSBundle mainBundle] loadNibNamed:@"MFGCell" owner:self options:nil];
    cell = [nib objectAtIndex:0];
}

cell.itemTitle.text = [item objectAtIndex:indexPath.row];
cell.itemDescription.text = [description objectAtIndex:indexPath.row];
cell.itemImageView.image = [UIImage imageNamed:[icons objectAtIndex:indexPath.row]];

return cell;
}
4

3 に答える 3

2

ユーザーのスワイプに反応して、ユーザーの選択を保存する必要があります(たとえば、タイプのプライベートインスタンス変数にNSMutableArray)。ユーザーがテーブルビューに戻ったら、の情報を再利用しtableView:cellForRowAtIndexPath:て、正しいアクセサリスタイルでセルを設定できます。

プロパティ宣言:

@property(nonatomic, retain) NSMutableArray* _accessoryStyle;

プロパティを合成します。次に、このスニペットをの下部に追加してhandleSwipeLeft:、ユーザーの選択を保存します。

- (void)handleSwipeLeft:(UISwipeGestureRecognizer *)gestureRecognizer
{
  [...]
  NSNumber* number = [numberWithInt:0];
  [_accessoryStyle replaceObjectAtIndex:indexPath.row withObject:number];
}

同様のスニペットをhandleSwipeRight::の下部に追加します。

- (void)handleSwipeRight:(UISwipeGestureRecognizer *)gestureRecognizer
{
  [...]
  NSNumber* number = [numberWithInt:1];
  [_accessoryStyle replaceObjectAtIndex:indexPath.row withObject:number];
}

tableView:cellForRowAtIndexPath:

NSString* accessoryImageName;
NSNumber* number = [_accessoryStyle objectAtIndex:indexPath.row];
switch ([number intValue])
{
  case 0:
    accessoryImageName = @"disclosure.png";
    break;
  case 1:
    accessoryImageName = @"tick.png";
    break;
  default:
    // replace with your error handling code
    return nil;
}
cell.accessoryView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:accessoryImageName]];

_accessoryStyleこれをすべて機能させるには、テーブルビューにセルがあると予想されるのと同じ数の要素で配列を初期化する必要があります。たとえば、ViewControllerのviewDidLoad

- (void) viewDidLoad
{
  [super viewDidLoad];

  self._accessoryStyle = [NSMutableArray arrayWithCapacity:0];
  NSNumber* defaultAccessoryStyle = [numberWithInt:0];
  int numberOfRows = 17;  // get the real number from somewhere
  for (int index = 0; index < numberOfCells; ++index)
    [_accessoryStyle addObject:defaultAccessoryStyle];
}

そしてこれのバランスをとるためにあなたは追加する必要があります

- (void) viewDidUnload
{
  [super viewDidUnload];
  self._accessoryStyle = nil;
}

まだ改善の余地があります。

  • より良い変数名を見つける
  • ハードコードされた数字0と1だけでなく、さまざまなスタイルの列挙型を使用します
  • UIImageViewテーブルビューセルごとに新しいセルを割り当てるのではなく、2つを割り当てて、アクセサリのスタイルに応じて適切なセルを使用してください。
于 2012-12-28T18:17:13.383 に答える
0

これを行う最善の方法は、画像/ボタンを配列に配置することです。ビューが読み込まれるたびに、インデックスが選択されているアイテムが表示されます..これを行うには、swipeMethode を次のように変更する必要があります。

-(void)swipeMethod: (UISwipeGestureRecognizer *) sender
{
    if(sender.direction == 
        UISwipeGestureRecognizerDirectionLeft && index < [myArray count]){   
        [self setSelectedIndex:index+1  animated:YES];  
        index++;
    }else if (sender.direction == UISwipeGestureRecognizerDirectionRight && index > 0) {
        [self setSelectedIndex:index-1 animated:YES]; 
        index--;
    }else {
        return;
    }
}

viewDidLoad に次のコードを追加します。

    leftRecognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipeMethod:)];
    [leftRecognizer setDirection: UISwipeGestureRecognizerDirectionLeft];
    [self.tableView addGestureRecognizer:leftRecognizer];

    rightRecognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipeMethod:)];
    [rightRecognizer setDirection: UISwipeGestureRecognizerDirectionRight];
    [self.tableView addGestureRecognizer:rightRecognizer];
于 2012-12-28T19:20:52.573 に答える
0

あなたの問題には、根本的なロジックの問題があります。これは、左にスワイプする必要がないときにイベントが発生するか、ビューがアンロードされてデフォルトにリセットされるためです。イベントが発生したときにログに記録できるかどうかを確認してください。それ以外の場合は、ビューの状態を保持する必要があります。int currentCellStateまた、状態を追跡するために、さまざまな状態に入ったときに変更するような追加の状態変数を追加することもできます。次に、viewDIdLoadすべてのデータとビューが同期していること、つまり の値がcurrentCellStateビューの状態と一致していることを確認します。

于 2012-12-28T18:22:33.347 に答える