1

カスタムが実装さUITableViewれたViewControllerにがあります。UITableClassこのテーブルには、ユーザーが再生できるさまざまな曲が表示されます。テーブルには、サーバーからデータをプルするメソッドが入力されます。このメソッドはで呼び出されViewDidLoadます。

ユーザーは、曲に「お気に入り」のタグを付けることもできます。ユーザーが新しい「UITableView」ですべての「お気に入り」のトラックを表示できるようにしたいと思います。このテーブルはまったく同じである必要がありますが、データソースが異なります(サーバーからのお気に入りのトラックのみ)。

これをどのように実装すればよいですか?'お気に入りの'トラックのみを含む新しいデータをテーブルにロードする別のメソッドを作成する必要がありますか?同じクラスで新しいUITableViewものを初期化し、どういうわけか別のデータソースまたは新しいViewControllerを設定する必要がありますか?もしそうなら、どのように?

を含む2つのViewControllerの間にはわずかな違いがありますUITableViews。すべてのトラックを含む元のViewControllerには、データソースを変更するか、新しいものを初期化するボタンがありますUITableView(実装方法によって異なります)。'お気に入りの'ViewControllerには戻るボタンがあります。

4

6 に答える 6

1

「お気に入り|すべて」のオプションを持つセグメント化されたコントロールを作成し、それが切り替えられると、BOOL呼び出されるfavoritesOnlyか、またはその逆に切り替えYESられます。NO私の曲はNSArrayofNSDictionaryと呼ばれる sに保持され、これをメソッドsongsArrayとして使用します。DataSource

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    if(favoritesOnly)
    {
        NSInteger count = 0;
        for(int n=0; n<[songsArray count]; n++)
            if([[[songsArray objectAtIndex:n] objectForKey:@"Favorite"] isEqualToString:@"YES"])
                count++;
        return count;
    } 
    else 
    {
        return [songsArray count];
    }
}

次に、セルの場合:

-(UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;
{
    UITableViewCell *theCell = [tableView dequeueReusableCellWithIdentifier:@"Proto Cell"];
    if(favoritesOnly)
    {
        NSInteger count = -1;
        for(int n=0; n<[songsArray count]; n++)
        {
            if([[[songsArray objectAtIndex:n] objectForKey:@"Favorite"] isEqualToString:@"YES"])
            {
                count++;
                if(count==[indexPath row])
                {
                     //Configure the Cell using [songsArray objectAtIndex:n]
                     return theCell;
                }
            }
        }
        //If you got here there was an error;  Error cell?
        return theCell;
    }
    else
    {
        //Configure cell using [songsArray objectAtIndex:[indexPath row]]
        return theCell;
    }
}  

このように、同じデータセットと同じUITableViewを使用しています。コントロールを使用してDataSource、情報を表示する方法を適切に委任しています。UITableView

ここで、CoreData と および を使用している場合NSFetchedResultsController、これはすべてはるかに簡単です。

于 2012-06-21T20:50:18.887 に答える
0

サーバーからのデータをどのように保存しますか?CoreData(またはMagicalRecord、私がお勧めします)を使用する場合、異なる引数を持つフェッチされた結果コントローラーを持つことが、必要な唯一の変更になることをお勧めします。

ああ、MagicalRecordへのリンク:MagicalRecord

于 2012-06-21T19:05:23.687 に答える
0

これを行う最も簡単な方法は、同じViewControllerの2つのインスタンスを持つことです。各インスタンスには独自のデータソースがあり、1つはすべての曲を含み、もう1つはお気に入りのみを含みます。

于 2012-06-21T22:30:53.673 に答える
0

いつでも中心的なプレイリストを更新するルートに進むことができます。その場合、(この場合はおそらく?)UITableViewのデータを交換してから を呼び出します。このスキームでは、複数のビューを持つことによるオーバーヘッドと、データを渡す際の問題を回避できます。dataSourceNSMutableArray *playlist[UITableView reloadData]

お気に入りの曲のリストに追加機能を作成する予定がある場合は、2 つ目のカスタマイズされた機能が適している可能UIViewController性があります。この意味で、追加の曲リストが必要な場合に再利用できます。これは、タイトルや曲順の編集など、リストでメイン インターフェイスを混乱させたくない追加の操作を彼らに任せたい場合に適したソリューションです。

これらの 2 つのビューが多かれ少なかれ同一である場合はUIViewController、新しいデータをプロパティ経由で渡すか、init にロードして、ビュー スタックにプッシュするだけで、新しい をセットアップできます。アプリがナビゲーション ベースである限り、セカンダリ UIViewController をスタックにプッシュすると、戻るボタンが単独で表示されます。これは、自分で追加する必要がある機能ではありません。この利点には、コードの再利用性が含まれます。これは、UI デザイナーおよびエンジニアとして持つべき優れたスキルです。

UIPopoverController読み取り専用ビューだけが必要な場合は、クリックすると消えるデータを調べることもできます。このソリューションは、少なくとも堅牢ではないため、ユーザーがエントリをタップする以上のことを行うことを意図している場合、またはデータセットが大きくなると予想される場合は使用しないでください。

UI とフローを計画するときは、将来の方向性を必ず考えてください。別の回答で述べたように、データの保存方法と、サーバーへの呼び出し方法 (設定時間後にボタンをクリックしますか?) によって違いが生じます。

于 2012-06-21T19:30:23.607 に答える
0

更新方法と、「すべて表示」と「お気に入りを表示」を切り替えるボタンがあります。

基本的に、ボタンがクリックされた場合、オブジェクトの反対のグループに切り替え、それに応じてボタンのテキストを更新します。私の例では、テーブルは常に「tableDataArray」と呼ばれる配列をロードし、その長さから行数などを取得します。

お気に入り...

-(IBAction)refresh {

if ([faveButton.text isEqualToString:@"Show All"]){

     tableDataArray = favoriteArray; 
     [faveButton setText:@"Show Favorites"];
    }
else {
    tableDataArray = allSongsArray;
    [faveButton setText:@"Show All"];
    }

 [tableView reloadData];

}
于 2012-06-21T19:38:08.027 に答える
0

曲をお気に入りとしてタグ付けする場合は、1 つのフラグをお気に入りとして Web サービスに送信し、お気に入りのビュー コントローラーで別の Web サービスを呼び出して、同じカスタム クラスで新しいテーブル ビューを作成し、サーバーからの新しいソースを表示します。 . また、sq-lite に保存する場合やコア データを使用する場合は、1 つの列をお気に入りとして余分に作成し、お気に入りのビュー コントローラーで呼び出して、別のデータ ソースで読み込みます。

于 2012-06-21T19:09:29.690 に答える