Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/112.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 故事板-基于回合的游戏工作流_Ios_Uitableview_Uiviewcontroller_Ios7_Storyboard - Fatal编程技术网

Ios 故事板-基于回合的游戏工作流

Ios 故事板-基于回合的游戏工作流,ios,uitableview,uiviewcontroller,ios7,storyboard,Ios,Uitableview,Uiviewcontroller,Ios7,Storyboard,我正在创建一个基于回合的游戏,希望了解我的工作流程的正确流程。目前我有以下几点: 主视图控制器(具有UITableView) 单击第1节中的行>加载路径为1的UINavigationController 单击第2节中的行>加载路径为2的UINavigationController 例如: 路径1-轮到你玩 路径2-猜猜轮到你了 每个路径大约有4-5个UIViewController加载到导航控制器中 现在,我正处于这样一个阶段:路径2完成后,用户也应该轮到自己玩(即先玩路径2,然后玩路径1) 完

我正在创建一个基于回合的游戏,希望了解我的工作流程的正确流程。目前我有以下几点:

主视图控制器(具有
UITableView

单击第1节中的行>加载路径为1的
UINavigationController
单击第2节中的行>加载路径为2的
UINavigationController

例如:
路径1-轮到你玩
路径2-猜猜轮到你了

每个路径大约有4-5个
UIViewController
加载到导航控制器中

现在,我正处于这样一个阶段:路径2完成后,用户也应该轮到自己玩(即先玩路径2,然后玩路径1)

完成此任务的正确方法是什么?我是否应该从路径2>中的最后一个控制器到路径1创建一个序列。问题是路径2有一个
UIViewController
,它有一个
UIImageView
,其中有一个大图像,它会挂在内存中。理想情况下,在用户启动路径1之前(路径2完成之后),它会被清除

  • 从路径2触发通知

  • 确保在主视图控制器中订阅该通知

  • 在主视图控制器中的通知处理程序方法中,调用 当前导航控制器的
    PoptorootViewController已激活:

  • 手动调用segue以启动路径1


  • 我建议您将第一个控制器设置为UINavigationController,并将其根控件设置为“主视图控制器”(UITableView)。现在我将其称为根导航控制器。然后,您可以保持应用程序的其余结构与现在相同,每个路线都有一个UINavigation控制器

    这将使您能够调用根导航控制器。在这种情况下,它将是您的“主视图控制器”。这样做有一个小小的缺点,那就是在路径上,您不能只调用当前导航控制器。因为这会让你回到你所处道路的起点

    但这很容易通过保留对根导航控制器的引用来解决。我可以通过将UINavigationController子类化并添加一个属性来存储对根视图控制器的引用。当视图控制器从表视图转换到控制两条路径之一的导航控制器时,需要完成分配。我想这是你处理这件事的最好办法

    至于你对记忆中的UIImageView的担忧。你不必为此担心。当视图控制器卸载时,它也将卸载UIImageView。防止视图控制器卸载的唯一方法是在另一个视图控制器中保留对它的强引用。有时您需要父/子关系,有时您不需要在视图控制器之间进行切换。但是在视图控制器之间传递属性应该可以。欲了解更多信息,请查看


    解决这个问题可能有很多不同的方法。因此,我会把我的答案作为一个起点,并根据您的应用程序和您的代码风格的未来情况调整它。

    我已经尝试了
    PoptorootViewController-imated
    ,但当我们想要movetopath2时,它不起作用。 我们可以将一些检查点存储在NSUserDefaults中,然后相应地进行分段,但这种方法在这种情况下不起作用。

    [self.navigationController popToRootViewControllerAnimated:YES];
    
    最后我找到了如下解决方案:
    从以下工作代码开始,并根据应用程序逻辑进行更改

    ViewController.m文件

     #pragma mark - UITableViewDelegate
     - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
    
    if (indexPath.section == 0)
    {
    
        UIStoryboard *mainStoryBoard = [UIStoryboard storyboardWithName:@"Main" bundle:[NSBundle mainBundle]];
    
        PathOneViewController *pathController = [mainStoryBoard instantiateViewControllerWithIdentifier:@"PathOneViewController"];
    
        [self.navigationController pushViewController:pathController animated:YES];
    
    }
    else
    {
        UIStoryboard *mainStoryBoard = [UIStoryboard storyboardWithName:@"Main" bundle:[NSBundle mainBundle]];
    
        PathTwoViewController *pathController = [mainStoryBoard instantiateViewControllerWithIdentifier:@"PathTwoViewController"];
    
        [self.navigationController pushViewController:pathController animated:YES];
    
    }
    }
    
     - (IBAction)actionMoveToPathTwo:(id)sender { // Move to path two
    
    AppDelegate *appDelegateTemp = [[UIApplication sharedApplication]delegate];
    
    UIViewController* rootController = [[UIStoryboard storyboardWithName:@"Main" bundle:[NSBundle mainBundle]] instantiateViewControllerWithIdentifier:@"PathTwoViewController"];
    
    UINavigationController* navigation = [[UINavigationController alloc] initWithRootViewController:rootController];
    appDelegateTemp.window.rootViewController = navigation;
    }
    
    - (IBAction)actionMoveToHome:(id)sender { // Move to table View
    
    AppDelegate *appDelegateTemp = [[UIApplication sharedApplication]delegate];
    
    UIViewController* rootController = [[UIStoryboard storyboardWithName:@"Main" bundle:[NSBundle mainBundle]] instantiateViewControllerWithIdentifier:@"ViewController"];
    
    UINavigationController* navigation = [[UINavigationController alloc] initWithRootViewController:rootController];
    appDelegateTemp.window.rootViewController = navigation;
    }
    
    - (IBAction)actionMoveToHome:(id)sender { // Move to table View
    
    
    AppDelegate *appDelegateTemp = [[UIApplication sharedApplication]delegate];
    
    UIViewController* rootController = [[UIStoryboard storyboardWithName:@"Main" bundle:[NSBundle mainBundle]] instantiateViewControllerWithIdentifier:@"ViewController"];
    
    UINavigationController* navigation = [[UINavigationController alloc] initWithRootViewController:rootController];
    appDelegateTemp.window.rootViewController = navigation;
    
    
    }
    
    - (IBAction)actionMoveToPath1:(id)sender { // Move to path one
    
    
    AppDelegate *appDelegateTemp = [[UIApplication sharedApplication]delegate];
    
    UIViewController* rootController = [[UIStoryboard storyboardWithName:@"Main" bundle:[NSBundle mainBundle]] instantiateViewControllerWithIdentifier:@"PathOneViewController"];
    
    UINavigationController* navigation = [[UINavigationController alloc] initWithRootViewController:rootController];
    appDelegateTemp.window.rootViewController = navigation;
    
    }
    
    PathOneDetailViewController.m文件

     #pragma mark - UITableViewDelegate
     - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
    
    if (indexPath.section == 0)
    {
    
        UIStoryboard *mainStoryBoard = [UIStoryboard storyboardWithName:@"Main" bundle:[NSBundle mainBundle]];
    
        PathOneViewController *pathController = [mainStoryBoard instantiateViewControllerWithIdentifier:@"PathOneViewController"];
    
        [self.navigationController pushViewController:pathController animated:YES];
    
    }
    else
    {
        UIStoryboard *mainStoryBoard = [UIStoryboard storyboardWithName:@"Main" bundle:[NSBundle mainBundle]];
    
        PathTwoViewController *pathController = [mainStoryBoard instantiateViewControllerWithIdentifier:@"PathTwoViewController"];
    
        [self.navigationController pushViewController:pathController animated:YES];
    
    }
    }
    
     - (IBAction)actionMoveToPathTwo:(id)sender { // Move to path two
    
    AppDelegate *appDelegateTemp = [[UIApplication sharedApplication]delegate];
    
    UIViewController* rootController = [[UIStoryboard storyboardWithName:@"Main" bundle:[NSBundle mainBundle]] instantiateViewControllerWithIdentifier:@"PathTwoViewController"];
    
    UINavigationController* navigation = [[UINavigationController alloc] initWithRootViewController:rootController];
    appDelegateTemp.window.rootViewController = navigation;
    }
    
    - (IBAction)actionMoveToHome:(id)sender { // Move to table View
    
    AppDelegate *appDelegateTemp = [[UIApplication sharedApplication]delegate];
    
    UIViewController* rootController = [[UIStoryboard storyboardWithName:@"Main" bundle:[NSBundle mainBundle]] instantiateViewControllerWithIdentifier:@"ViewController"];
    
    UINavigationController* navigation = [[UINavigationController alloc] initWithRootViewController:rootController];
    appDelegateTemp.window.rootViewController = navigation;
    }
    
    - (IBAction)actionMoveToHome:(id)sender { // Move to table View
    
    
    AppDelegate *appDelegateTemp = [[UIApplication sharedApplication]delegate];
    
    UIViewController* rootController = [[UIStoryboard storyboardWithName:@"Main" bundle:[NSBundle mainBundle]] instantiateViewControllerWithIdentifier:@"ViewController"];
    
    UINavigationController* navigation = [[UINavigationController alloc] initWithRootViewController:rootController];
    appDelegateTemp.window.rootViewController = navigation;
    
    
    }
    
    - (IBAction)actionMoveToPath1:(id)sender { // Move to path one
    
    
    AppDelegate *appDelegateTemp = [[UIApplication sharedApplication]delegate];
    
    UIViewController* rootController = [[UIStoryboard storyboardWithName:@"Main" bundle:[NSBundle mainBundle]] instantiateViewControllerWithIdentifier:@"PathOneViewController"];
    
    UINavigationController* navigation = [[UINavigationController alloc] initWithRootViewController:rootController];
    appDelegateTemp.window.rootViewController = navigation;
    
    }
    
    PathTwoDetailViewController.m文件

     #pragma mark - UITableViewDelegate
     - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
    
    if (indexPath.section == 0)
    {
    
        UIStoryboard *mainStoryBoard = [UIStoryboard storyboardWithName:@"Main" bundle:[NSBundle mainBundle]];
    
        PathOneViewController *pathController = [mainStoryBoard instantiateViewControllerWithIdentifier:@"PathOneViewController"];
    
        [self.navigationController pushViewController:pathController animated:YES];
    
    }
    else
    {
        UIStoryboard *mainStoryBoard = [UIStoryboard storyboardWithName:@"Main" bundle:[NSBundle mainBundle]];
    
        PathTwoViewController *pathController = [mainStoryBoard instantiateViewControllerWithIdentifier:@"PathTwoViewController"];
    
        [self.navigationController pushViewController:pathController animated:YES];
    
    }
    }
    
     - (IBAction)actionMoveToPathTwo:(id)sender { // Move to path two
    
    AppDelegate *appDelegateTemp = [[UIApplication sharedApplication]delegate];
    
    UIViewController* rootController = [[UIStoryboard storyboardWithName:@"Main" bundle:[NSBundle mainBundle]] instantiateViewControllerWithIdentifier:@"PathTwoViewController"];
    
    UINavigationController* navigation = [[UINavigationController alloc] initWithRootViewController:rootController];
    appDelegateTemp.window.rootViewController = navigation;
    }
    
    - (IBAction)actionMoveToHome:(id)sender { // Move to table View
    
    AppDelegate *appDelegateTemp = [[UIApplication sharedApplication]delegate];
    
    UIViewController* rootController = [[UIStoryboard storyboardWithName:@"Main" bundle:[NSBundle mainBundle]] instantiateViewControllerWithIdentifier:@"ViewController"];
    
    UINavigationController* navigation = [[UINavigationController alloc] initWithRootViewController:rootController];
    appDelegateTemp.window.rootViewController = navigation;
    }
    
    - (IBAction)actionMoveToHome:(id)sender { // Move to table View
    
    
    AppDelegate *appDelegateTemp = [[UIApplication sharedApplication]delegate];
    
    UIViewController* rootController = [[UIStoryboard storyboardWithName:@"Main" bundle:[NSBundle mainBundle]] instantiateViewControllerWithIdentifier:@"ViewController"];
    
    UINavigationController* navigation = [[UINavigationController alloc] initWithRootViewController:rootController];
    appDelegateTemp.window.rootViewController = navigation;
    
    
    }
    
    - (IBAction)actionMoveToPath1:(id)sender { // Move to path one
    
    
    AppDelegate *appDelegateTemp = [[UIApplication sharedApplication]delegate];
    
    UIViewController* rootController = [[UIStoryboard storyboardWithName:@"Main" bundle:[NSBundle mainBundle]] instantiateViewControllerWithIdentifier:@"PathOneViewController"];
    
    UINavigationController* navigation = [[UINavigationController alloc] initWithRootViewController:rootController];
    appDelegateTemp.window.rootViewController = navigation;
    
    }
    

    对我有效的答案实际上是一种更简单的方法。将ViewController引用添加到Path2的启动视图控制器。然后只需更改
    UINavigationController
    堆栈中的视图控制器。由于导航控制器不是子类,或者不需要子类,因此这可以正常工作

    - (IBAction)completeButtonPressed:(id)sender {
        NSLog(@"complete button pressed");
    
        Path2ViewController *path2StartVC = [[UIStoryboard storyboardWithName:@"Main" bundle:[NSBundle mainBundle]] instantiateViewControllerWithIdentifier:@"Path21VC"];
    
        [self.navigationController setViewControllers:[NSArray arrayWithObject:path2StartVC] animated:YES];
    
    }
    

    我将很快将一个示例项目放到github上以供参考。

    谢谢。对于项目1,您的意思是创建路径2已开始或结束的通知吗?对于第3项,您说一旦调用通知,就调用当前导航控制器poptroot。这样做的问题是根视图控制器将是路径1根视图控制器。。。不是吗?我建议在path2结束时触发一个通知,因此父VC需要显示第二个导航控制器。我想你不一定需要解开第一个导航控制器。您可能只需在notification hander中将segue解绑到导航VC,然后再转到另一个。感谢您的回答,事实上,我只需使用导航控制器上的
    setViewControllers
    方法,将path2作为路由加载,就可以实现这一点,因此,请取消其余部分。感谢您的详细回复。事实上,我能够用一种更简单的方法来完成,即在导航控制器上简单地使用
    setViewControllers
    方法。这个dealloc是旧的控制器,并将新的作为根加载。见下面的答案。感谢Hanks@Rob,您能详细介绍一下您提到的
    UIImageView
    参考资料吗。我使用来自
    UIViewController
    的强引用创建
    UIImageView
    。我将一个强UIImage引用传递给一个新控制器,然后在viewDidLoad中将该图像放入
    UIImageView
    。我对下一个控制器重复同样的步骤,将
    UIImage
    通过一个序列传递到最终控制器的强引用中。@StuardM我更新了帖子,在重新阅读我写的内容后,它不是100%正确。谢谢你的关注。