1

UITableView在 ViewController 中有一个自定义UITableClass实现。该表显示用户可以播放的不同歌曲。该表由从服务器提取数据的方法填充。这个方法在ViewDidLoad.

用户还可以将歌曲标记为“最喜欢的”。我希望用户能够在新的“UITableView”中查看他们所有“最喜欢的”曲目。该表应该完全相同,只是具有不同的数据源(仅来自服务器的收藏曲目)。

我应该如何实现这个?我应该创建另一种方法,将新数据加载到只有“收藏”曲目的表中吗?是否应该使用相同的类初始化一个新UITableView的并以某种方式设置不同的数据源或新的 ViewController?如果是这样,怎么做?

包含UITableViews. 带有所有轨道的原始 ViewController 将有一个按钮,该按钮可以更改数据源或初始化新的数据源UITableView(取决于它的实现方式)。'favorite' ViewController 将有一个后退按钮。

4

6 回答 6

1

我将创建一个分段控件,该控件具有“收藏夹|全部”选项,当它被切换时,被BOOL调用favoritesOnly或类似的东西被切换YESNO,反之亦然。我的歌曲将保存在NSArrayof NSDictionarys中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,您只是使用您的控件来正确委派如何DataSourceUITableView

现在,如果您使用 CoreData 和 and NSFetchedResultsController,这一切都容易得多。

于 2012-06-21T20:50:18.887 回答
0

您如何存储来自服务器的数据?如果您使用 CoreData(或我可以推荐的 MagicalRecord),那么拥有具有不同参数的获取结果控制器将是您需要的唯一更改.....

啊,MagicalRecord的链接:MagicalRecord

于 2012-06-21T19:05:23.687 回答
0

当您将歌曲标记为收藏时,将一个标志作为收藏发送到 Web 服务,然后在收藏视图控制器中调用另一个 Web 服务并使用相同的自定义类创建新的表视图并查看来自服务器的新源.. . 如果您存储在 sq-lite 中或使用核心数据,请额外添加一列作为收藏夹,并在收藏夹视图控制器中调用它并使用不同的数据源加载它。

于 2012-06-21T19:09:29.690 回答
0

您总是可以只更新中央播放列表的路线UITableView,在这种情况下,您只需交换您的数据dataSource(在这种情况下,也许NSMutableArray *playlist?)然后调用[UITableView reloadData]. 在这个方案中,您避免了拥有多个视图的开销和传递数据的麻烦。

如果您计划为您喜爱的歌曲列表创建附加功能,UIViewController则可能需要一个辅助的、自定义的。从这个意义上说,如果您决定拥有其他歌曲列表,则可以重复使用它。如果您打算让他们做任何其他您不希望主界面与列表混乱的事情,例如编辑标题、歌曲顺序等,这将是一个很好的解决方案。

如果这两个视图或多或少相同,您可以设置一个 new 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

最简单的方法是拥有同一个视图控制器的两个实例。每个实例都有自己的数据源,一个包含所有歌曲,另一个包含收藏夹。

于 2012-06-21T22:30:53.673 回答