0

私が達成しようとしていることは単純ですが、最初の考えからです。とうとう扱いにくかった。

テーブルビューを選択リストとしてプッシュしたいのですが、ユーザーが1つのセルを選択すると、セル文字列が選択された文字列として前のビューに送信されました。

最初に2枚の写真を見てください

ハウジングを選択し、次のビューにプッシュします

このビューで 1 つのセルを選択します

私を悩ませているのは、次のことです。

(少なくとも) 2 つのボタンを提供したいと思います。左側の 1 つはナビゲーション コントローラーによって自動生成される戻るボタンで、右側のボタンは編集用です。また、ナビゲーション コントローラーにはデフォルトで 2 つのボタンがあります (私の知る限り)。そのため、ユーザーがタップして確認し、前のビューにポップする「完了」ボタンの場所はありません。したがって、ユーザーがセル、たとえば「着用」をタップすると、次のことが自動的に発生し、ユーザーが視覚的に認識できるようになります。

  1. ユーザーは、「Housing」セルがマークされていないことを確認できます
  2. 次に、ユーザーは「着用」セルがマークされていることを確認できます
  3. 次に、少しの時間間隔 (たとえば 0.2 秒) の後、前のビューにポップして、選択を自動的に更新します。

最初は簡単だと思っていましたが、そうではありません。これを行うための私のコードは次のとおりですが、有線で動作します

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

dispatch_queue_t queue=dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH,0ul); dispatch_async(queue, ^{ //unmark previous cell if (selectedIndexPath!=nil) { [[self.tableView cellForRowAtIndexPath:selectedIndexPath]setAccessoryType:UITableViewCellAccessoryNone]; } selectedIndexPath=indexPath; //get the selected cell to mark UITableViewCell *cell=[self.tableView cellForRowAtIndexPath:indexPath]; [cell setAccessoryType:UITableViewCellAccessoryCheckmark]; dispatch_sync(dispatch_get_main_queue(), ^{ //wait a little [NSThread sleepForTimeInterval:0.2]; //return to previous view NSLog(@"here........."); if ([objectToUpdateCategory respondsToSelector:@selector(updateCategoryTo:withSelectedIndexPath:)]) { NSLog(@"sending.......... update info"); [objectToUpdateCategory updateCategoryTo:cell.textLabel.text withSelectedIndexPath:selectedIndexPath]; NSLog(@"sent update info"); } [self.navigationController popViewControllerAnimated:YES]; }); });

トリッキーなことは、[self.navigationController popViewControllerAnimated:YES] ;を入れた場合です。最後まで、ビューはマーク解除およびマーク ステップを視覚的に更新せず、すぐに前のビューに戻ります。最初、マーク解除のことを考えていなかったとき、コード内の「キュー」は、ポップバックする前に視覚的にマークステップを実行できますが、機能しない場合があります。私のコードが正しいかどうかはわかりませんが、実際にはわかりません. Apple のこのキュー技術をよく理解していません.しかし、NSThread / キューまたはその他の同時実行性を処理するものと関係があると確信しています.Apple のドキュメントを丸一日チェックしましたが、直接的な答えは見つかりませんでした.

誰かがこれについて私を助けてくれることを願っています、事前に感謝します:)

4

2 に答える 2

1

「少しの時間間隔 (0.2 秒など) の後、前のビューにポップする」には、performSelector:withObject:afterDelay:メソッドまたはそのバリアントの 1 つを使用します。

[self performSelector:@selector(delayedPop) withObject:nil afterDelay:0.2];

をメソッドに入れます。たとえば、次のようpopViewControllerAnimatedになります。delayedPop

-(void)delayedPop{
    [self.navigationController popViewControllerAnimated:YES];
}
于 2013-05-12T11:44:47.287 に答える