gpt4 book ai didi

ios - 如何使用SWRevealViewController在两个 View 之间传递数组?

转载 作者:行者123 更新时间:2023-12-01 16:44:12 25 4
gpt4 key购买 nike

QUICK背景:

我有一个可在可搜索的标签式界面(也称为“Cheers View Controller”)中显示歌曲列表的应用。有两个选项卡,每个选项卡对应我的欢呼类别。我有一个侧边栏,可让您选择菜单选项,其中一个称为“我的收藏夹”。它使用SWReveal控制器(也称为“Sidebar”)。我试图允许用户在游戏时间之前标记最喜欢的欢呼声,然后在边栏中使用侧边栏导航快速引用他们最喜欢的歌曲列表。

我的应用程序的初始视图控制器是Reveal View Controller。

前视图(sw_front)是选项卡栏控制器,它在应用程序首次启动时显示Cheers View Controller。数据会从Cheers View Controller的ViewDidLoad中以CSV文件的形式加载到数组中。

后方控制器(sw_rear)是侧边栏,它定义了我的应用程序的菜单选项。补充工具栏上的菜单选项之一称为“我的收藏夹”。从概念上讲,正是这种侧边栏让我失望。有关我的故事板相关区域的快照,请参见下文。

故事板快照:
事实证明,作为新用户,我无法发布图像。 :(

目标

我试图从“我的收藏夹”视图控制器访问“Cheers”视图控制器中的“最喜欢的欢呼”数组。从Cheers View Controller到“我的收藏夹”当前没有没有segue ,似乎在这里定义segue在概念上是错误的。

我不想使用单例或其他解决方法,而是希望以正确的方式构建应用程序。一个简单的解决方案是将“我的收藏夹”移到选项卡栏控制器的另一个选项卡上。虽然我可以更改设计,并且事情可能会更容易,但是我似乎在这里缺少了可以在以后的应用程序中使用的有价值的概念。

我意识到,已经有很多关于将数据从一个控制器传递到另一个控制器的文章。我已经阅读了我认为的所有内容,但还不能成功地将解决方案合并到SWRevealController实现中。很明显,我对机械或概念(或两者)都感到困惑。我阅读的大多数文章都涉及到segue或两个具有segue或某种关系的控制器之间的传递字段。

机械问题:

我目前在主选项卡式界面的表视图控制器的ViewDidLoad中准备收藏夹数组。在将所有来自CSV文件的歌曲加载到主数组后,我立即执行了此操作。我以为可以将其传递给“我的收藏夹”表视图控制器,或者从“我的收藏夹表”视图控制器访问它。

//Copy favorite cheers into array
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF.favorite contains[c] %@",@"Yes"];
NSArray *tempArray = [self.cheersArray filteredArrayUsingPredicate:predicate];

self.myFavoriteCheersArray = [NSMutableArray arrayWithArray:tempArray];

这对我来说很棘手-用户单击按钮以显示补充工具栏,然后单击“我的收藏夹”时:

补充工具栏的prepareForSegue将与此一起执行:
- (void) prepareForSegue: (UIStoryboardSegue *) segue sender: (id) sender
{
// Get the selected row and identify the destination controller you are sending to
NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];
UINavigationController *destViewController = (UINavigationController*)segue.destinationViewController;

// Set the title of navigation bar by using the menu items
destViewController.title = [[_menuItems objectAtIndex:indexPath.row] capitalizedString];

if ( [segue isKindOfClass: [SWRevealViewControllerSegue class]] ) {
SWRevealViewControllerSegue *swSegue = (SWRevealViewControllerSegue*) segue;

swSegue.performBlock = ^(SWRevealViewControllerSegue* rvc_segue, UIViewController* svc, UIViewController* dvc) {

UINavigationController* navController = (UINavigationController*)self.revealViewController.frontViewController;
[navController setViewControllers: @[dvc] animated: NO ];
[self.revealViewController setFrontViewPosition: FrontViewPositionLeft animated: YES];
};

}

我试图将其添加到prepareForSegue的末尾,以某种方式允许“我的收藏夹”访问数组...但是我在从侧边栏的Cheers View Controller中标识属性时遇到了麻烦...
    if([segue.identifier isEqualToString:@"myFavorites"]) {

//Get the Favorites View Controller (which has a navigation controller)
MyFavoritesViewController *myFavoritesViewController = [[MyFavoritesViewController alloc] init];
myFavoritesViewController = (MyFavoritesViewController*)destViewController.topViewController;

//THIS BELOW PART IS SHAKEY AT BEST
//Get the Cheers View Controller (which is part of a tabbed view controller)
SWRevealViewController *frontViewController = [[SWRevealViewController alloc] init];
CheersViewController *cheersViewController = (CheersViewController*)frontViewController.frontViewController;

//Pass the Favorites Array -- The below code gives me an error that the property I set on the CheersViewController is not found.
rankingViewController.favoriteCheers = CheersViewController.myFavoriteCheersArray;
}


}

我喜欢注释的概念:
  • 什么是最好的方法(最好是指实现现实和学术纯正之间的一种平衡方法),以便在没有定义OO概念/设计的情况下未定义序列时,使数组可用于其他视图控制器?
  • 后视图控制器(侧边栏)在应用启动时不会加载-而是在第一个显示器上加载。因此,我是第一次在Cheers View Controller中加载数据是否正确(即我可以在应用启动时加载补充工具栏,但由于用户可能永远无法访问补充工具栏,这在概念上也是错误的)?
  • 最好在应用程序首次在Cheers View Controller中启动时或仅在首次查看“我的收藏夹”时准备“我的收藏夹”数组吗?该列表相当小,但是从技术上讲,如果用户从未单击侧栏以查看其收藏夹,那么我将不必要地加载额外的数组-可能很小,因为该数组很小,但我很好奇。
  • 是当前将数据加载到的合适位置吗?
  • 在我看来,从概念上讲,委托没有意义,因为Cheers View Controller确实不需要知道用户在查看他/她的收藏夹。我真正要做的就是尝试查询一组主数据。我这样想对吗?
  • 最佳答案

    这些是如何解决的。它们有效-至于它们是否是最好的,我会在我了解更多信息的同时通知您。咧嘴笑

    问题1:从pDlist,CSV或AppDelegate didFinishLaunchingWithOptions中的任何其他源文件中加载一组初始数据。例如:

    //Read in from JSON file
    NSError *error;
    NSData *data = [NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Cheers" ofType:@"json"]];
    NSDictionary *json = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error];

    self.cheersArray = json[@"cheers"];

    此数组可以是不可变的(即NSArray),您可以将其强制转换为视图控制器,如果需要,可以将其作为NSMutableArray进行操作。例如:
    //Instantiate initial view controller
    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:[NSBundle mainBundle]];
    CMViewController *cmViewController = [storyboard instantiateInitialViewController];

    //Pass array of data into a table view controller
    cmViewController.tableData = (NSArray *)self.tableData;

    假设您的View Controller具有可用于将数据传递到其中的属性。

    如果您有JSON文件并需要将其作为PLIST,则Mac上通过Terminal提供了一个很棒的实用程序
    plutil -convert xml1 InputFileName.json -o OutputFileName.plist

    正如您所学的那样,您可能会发现行数较少的数据优先于JSON文件,并且在保存数据更改时(如果您的应用允许)更容易处理(个人意见) 。

    问题2:从学术角度来看,在应用程序启动时加载补充工具栏在概念上是错误的。仅应在首次使用时加载。

    问题3:类似于问题2,最好将“收藏夹”数组传递给在第一次请求时需要它的视图控制器(即,用户按下“收藏夹”选项卡。由于从技术上讲,“收藏夹”只是该子集的特定视图)我正在加载的主数据,我相信这是正确的。

    问题4:我将其从第一个视图控制器移到了App Delegate,如上所示。这给了我更大的灵活性,可以向下传递数据(从概念上讲是从父级传递到子级视图控制器),而不是跨数据(从子级到子级视图控制器)传递数据。这简化了我的代码。

    问题5:我认为不适合代表我所面临挑战的答案。

    随时发表评论!

    关于ios - 如何使用SWRevealViewController在两个 View 之间传递数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21465779/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com