使用不同的数据源复制UITableView

时间:2012-06-21 19:02:17

标签: iphone objective-c ios uitableview

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

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

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

包含UITableViews的两个ViewController之间会略有不同。包含所有轨道的原始ViewController将有一个按钮,可以更改数据源或初始化新的UITableView(取决于它的实现方式)。 'favited'ViewController将有一个后退按钮。

6 个答案:

答案 0 :(得分:1)

我会创建一个分段控件,其中包含“收藏夹|全部”选项,当切换时,名为BOOL的{​​{1}}或类似内容从favoritesOnly切换为{{ 1}}或反之亦然。我的歌曲将保存在名为YES的{​​{1}} NO中,我会将其用作NSArray方法:

NSDictionary

然后是细胞:

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; } } 上显示信息的方式

现在,如果你使用的是CoreData和UITableView,那么这就容易多了。

答案 1 :(得分:0)

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

啊,链接到MagicalRecord:MagicalRecord

答案 2 :(得分:0)

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

答案 3 :(得分:0)

您可以随时选择更新中央播放列表UITableView的路线,在这种情况下,您只需交换dataSource中的数据(在这种情况下,可能是NSMutableArray *playlist?)然后拨打[UITableView reloadData]。在此方案中,您可以避免拥有多个视图的开销以及传递数据的麻烦。

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

如果这两个视图或多或少相同,您可以设置一个新的UIViewController,通过属性传递新数据或在init中加载它,然后将其推送到视图堆栈。只要您的应用程序是基于导航的,一旦您将辅助UIViewController推入堆栈,后退按钮就会自动显示。这不是您需要自己添加的功能。这方面的好处包括代码可重用性,这是一个很好的技能,可以作为UI设计师和工程师。

如果您只想要一个只读视图,您还可以查看UIPopoverController,其中包含点击后会解散的数据。此解决方案至少不具备可靠性,如果您希望用户执行的操作不仅仅是点击条目,或者您希望数据集变大,则不应使用此解决方案。

在规划用户界面和流程时,请确保考虑将来可能采用的方向。正如另一个答案中所提到的,如何存储数据会产生影响,以及您打算如何调用服务器(按钮点击次数?经过一段时间后?)

答案 4 :(得分:0)

我会有一个刷新方法,以及一个在“show all”和“show favorites”之间切换的按钮。

基本上,如果单击该按钮,请切换到相反的对象组,并相应地更新按钮上的文本。该表将始终在我的示例中加载一个名为“tableDataArray”的数组,并且您将从其长度获得行计数等。

...一样

-(IBAction)refresh {

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

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

 [tableView reloadData];

}

答案 5 :(得分:0)

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