我在ViewController中有一个UITableView
,其中实现了自定义UITableClass
。该表显示用户可以播放的不同歌曲。该表由一个从服务器提取数据的方法填充。在ViewDidLoad
中调用此方法。
用户还可以将歌曲标记为“收藏”。我希望用户能够在新的“UITableView”中查看他们所有的“最爱”曲目。此表应该完全相同,只能使用不同的数据源(仅限来自服务器的磁道)。
我该如何实现?我应该创建另一种方法,只使用“收藏”曲目将新数据加载到表格中吗?应该使用相同的类初始化一个新的UITableView
,并以某种方式设置不同的数据源或新的ViewController?如果是这样,怎么样?
包含UITableViews
的两个ViewController之间会略有不同。包含所有轨道的原始ViewController将有一个按钮,可以更改数据源或初始化新的UITableView
(取决于它的实现方式)。 'favited'ViewController将有一个后退按钮。
答案 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)
最简单的方法是拥有相同视图控制器的两个实例。每个实例都有自己的数据源,一个包含所有歌曲,另一个只包含收藏夹。