0

ショップの名前を含むsqllitedbからのデータをviewDidLoadに入力した2つのテーブルビューがあります。最初のビューでは1つの要素(つまり1つのショップ)を選択し、2番目のビューでは最初のショップとは異なる別のショップを選択する必要があります。

塗りつぶされた後、2番目のテーブルビューの行の1つを無効にできますか?

2番目のビューで(最初に選択されたショップの)名前をロードしないようにしましたが、viewDidLoadにテーブルビューを入力しました。残念ながら、最初に選択されたショップの名前に関するデータは、viewDidAppearとその瞬間は、テーブルビューを埋めるには遅すぎます。

また、この方法で2番目のビューで1つの行を選択したイベントにアラートを追加しようとしました

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
   NSString *choosenSecondShop= [secondShop objectAtIndex:indexPath.row];
   NSString* nameFirstShop = [function loadFirstShopChoosen]; 

   if ([choosenSecondShop isEqualToString:nameFirstShop]) {
       NSString *message=@"Second shop cannot match the first";
       alert = [[UIAlertView alloc] initWithTitle:@"Errore"
            message: message
            delegate: self cancelButtonTitle: @"Ok" 
            otherButtonTitles:nil, 
            nil];
       [alert show];
    }else {
        // go on with the app's stuff!
    }
}

ただし、この場合、アラートが表示されますが、セグエも続きます。セグエが続くのを防ぐことができますか?

4

1 に答える 1

1

この問題を攻撃する方法はいくつかあります。

1.条件付きセグエ

これはうまくいくはずですが、ユーザーエクスペリエンスの観点からは素晴らしいアイデアかどうかはわかりません。

おそらくあなたはテーブルセルから始めてIBでセグエを作りましたか?これを行うと、セグエを実行するためのコードが不要になるという便利さが得られます(テーブルセルをタップすると自動的に実行されます)が、実行時に制御することもできません。

セグエを実行するかどうか、いつ、どのセグエを実行するかをプログラムで制御する必要がある場合は、(内部のコントロールからではなく)View Controller自体から開始してセグエを作成し、IBでそのセグエに一意の識別子を指定する必要があります。次に、実装で、セグエを実行することがわかったらtableView:didSelectRowAtIndexPath:呼び出すことができます。[self performSegueWithIdentifier:@"myIdentifier"]

2.セル選択を無効にする

特定のセルが選択されないようにするために、テーブルビューコントローラーは、ユーザーに選択させたくないインデックスパスtableView:willSelectRowAtIndexPath:を返すように実装できます。nil

その場合、どの行を選択できるかをユーザーに明確にしたいと思うかもしれません。セルの外観をで変更できますtableView:cellForRowAtIndexPath:

3.セルを表示しない

でテーブルビューにデータを入力していると言いますがviewDidLoad、実際にはそのようには機能しません。テーブルビューは、必要なときにデータソースとデリゲートメソッドを呼び出すことでデータを入力します。データセットのアイテムがテーブルのセルとして表示されないようにする場合は、データソースとデリゲートメソッドの動作を変更するだけです。

  • tableView:numberOfRowsInSection:それ以外の場合よりも1つ少ない数を返す必要があります
  • tableView:cellForRowAtIndexPath:アイテムの削除を反映する必要があります。何かのようなもの:

    MyShop *shop;
    if (indexPath.row < indexOfFirstShop)
        shop = [shops objectAtIndex:indexPath.row];
    else
        shop = [shops objectAtIndex:(indexPath.row + 1)];
    // then configure cell for the chosen shop
    

これらのメソッドが最初に呼び出されたときに非表示にする行がわからない場合は、その情報を取得したら、テーブルビューに再度呼び出す必要があることを通知する[self.tableView reloadData]だけです。騙す。

于 2012-05-22T17:07:32.533 に答える