在 iOS 中将视图控制器的保存状态保存在 SWRevealController 中?

keep saved state of view controller in SWRevealController in iOS?

我在我的 app.I 中使用 SWRevealController,有一个 MainController 作为 "HOME",它会在应用程序启动时显示。现在我在该屏幕上有 textfield 和其他控件。当我切换到另一个屏幕并返回 "Home" 时,"Home" 屏幕上的所有数据都消失了。它不显示任何数据 there.I 想要保持其状态已保存。现在我想将该视图控制器保留在堆栈中,这样当我回到这个 viewcontroller 它仍然在堆栈中并且其他视图控制器只是弹出 out.Please 解释我该怎么做?

我为此使用以下代码。

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell=[self.tableView cellForRowAtIndexPath:indexPath];
    if(indexPath.row==0)
    {
        [self performSegueWithIdentifier:@"home" sender:cell];
        [cell setSelected:YES];
    }

    else if(indexPath.row==1)
    {
        [self performSegueWithIdentifier:@"settings" sender:cell];
    }

    else if(indexPath.row==2)
    {
        [self performSegueWithIdentifier:@"help" sender:cell];
    }
    else if(indexPath.row==3)
    {
        [self performSegueWithIdentifier:@“about” sender:cell];
    }

}

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    NSLog(@"Segue");
    NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];
    UINavigationController *destViewController = (UINavigationController*)segue.destinationViewController;
    destViewController.title = [[titles objectAtIndex:indexPath.row] capitalizedString];
   if([segue.identifier isEqualToString:@"settings"])
    {
        self.revealViewController.navigationItem.title = @"settings";

    }
    else  if([segue.identifier isEqualToString:@"help"])
    {
        self.revealViewController.navigationItem.title = @"help";
    }
    else  if([segue.identifier isEqualToString:@"about"])
    {
        self.revealViewController.navigationItem.title = @"about";
    }

    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];



        };

    }

  }

编辑:

它尝试了下面的代码并且它正在工作,以防我在 "Home" 和其他屏幕之间切换两次。

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell=[self.tableView cellForRowAtIndexPath:indexPath];
    if(indexPath.row==0)
    {
        if(objMainController != nil)
        {
            UINavigationController* navController = (UINavigationController*)self.revealViewController.frontViewController;
            [navController setViewControllers: @[objMainController] animated: NO ];
            [self.revealViewController setFrontViewPosition: FrontViewPositionLeft animated: YES];
        }
        else
        {
            [self performSegueWithIdentifier:@"home" sender:cell];
            [cell setSelected:YES];
        }

    }
    else if(indexPath.row==1)
    {

        [self performSegueWithIdentifier:@"settings" sender:cell];
    }
    else if(indexPath.row==2)
    {

        [self performSegueWithIdentifier:@"help" sender:cell];
    }
    else if(indexPath.row==3)
    {

        [self performSegueWithIdentifier:@"about" sender:cell];
    }


}

准备中

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    NSLog(@"Segue");
    NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];
    UINavigationController *destViewController = (UINavigationController*)segue.destinationViewController;
    destViewController.title = [[titles objectAtIndex:indexPath.row] capitalizedString];
   if([segue.identifier isEqualToString:@"settings"])
    {
        self.revealViewController.navigationItem.title = @"settings";

    }
    else  if([segue.identifier isEqualToString:@"about"])
    {
        self.revealViewController.navigationItem.title = @"about";
    }
    else  if([segue.identifier isEqualToString:@"help"])
    {
        self.revealViewController.navigationItem.title = @"help";
    }


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

        swSegue.performBlock = ^(SWRevealViewControllerSegue* rvc_segue, UIViewController* svc, UIViewController* dvc) {
            UINavigationController* navController = (UINavigationController*)self.revealViewController.frontViewController;
            if([segue.identifier isEqualToString:@"home"])
            {
                objMainController = (MainViewController*)destViewController;
                self.revealViewController.navigationItem.title = @"home";
                [navController setViewControllers: @[objMainController] animated: NO ];
            }
            else
            {
                [navController setViewControllers: @[dvc] animated: NO ];

            }

            [self.revealViewController setFrontViewPosition: FrontViewPositionLeft animated: YES];
        };

    }

  }

每次执行 segue 时,都会在 destinationViewController 中为您创建一个新的 UIViewController 实例,您需要在创建后(第一次)保留对此实例的引用。

第 1 步

保留对您需要保存状态的所有 UIViewController 个实例的引用-

SettingsViewController* objSettingsVC;

第 2 步

如果您需要导航到的屏幕实例之前已创建,则不要执行 segue-

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell* cell = [self.tableView cellForRowAtIndexPath:indexPath];

    if(indexPath.row == 1)
    {
        if(objSettingsVC != nil)
        {
            UINavigationController* navController = (UINavigationController*)self.revealViewController.frontViewController;
            [navController setViewControllers: @[objSettingsVC] animated: NO ];
            [self.revealViewController setFrontViewPosition: FrontViewPositionLeft animated: YES];
        }
        else
        {
            [self performSegueWithIdentifier:@"settings" sender:cell];
        }
    }
}

第 3 步

UIViewController 实例保存在一个变量中,以便稍后在 prepareForSegue: -

中首次创建时引用它
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    UINavigationController* destViewController = (UINavigationController*)segue.destinationViewController;

    if([segue.identifier isEqualToString:@"settings"])
    {
        objSettingsVC = (SettingsViewController*)destViewController;
        self.revealViewController.navigationItem.title = @"Settings";
    }
}

希望对您有所帮助。

更新:

正如下面评论中所讨论的,您还需要将 initialViewController 实例保存在一个变量中。以下是您的操作方法。

AppDelegate.h

#import <UIKit/UIKit.h>
#import "ViewController.h"

@interface AppDelegate : UIResponder <UIApplicationDelegate>

@property (strong, nonatomic) UIWindow *window;
@property (strong, nonatomic) ViewController *objMainController;


@end

ViewController.m

#import "ViewController.h"
#import "AppDelegate.h"

@interface ViewController ()

@end

@implementation ViewController

-(void)viewDidLoad
 {
     [super viewDidLoad];

     AppDelegate* appDelegate = (AppDelegate*)[[UIApplication sharedApplication] delegate];
     appDelegate.objMainController = self;
 }


 @end

这不是一个很好的方法,但它会让你继续前进。您的 AppDelegate 不应该是所有这些导航逻辑的一部分,您应该将其保存在一个单独的对象中,负责您的应用程序导航。也许你的 SideTableViewController 在你的情况下。