菜鸟教程小白 发表于 2022-12-13 17:01:22

ios - 在 iOS 的 SWRevealController 中保持 View Controller 的保存状态?


                                            <p><p>我在我的应用程序中使用 <code>SWRevealController</code>。我有一个 <code>MainController</code> 作为“HOME”,它会在应用程序启动时显示。现在我在该屏幕上有 <code>textfield</code> 和其他控件。当我切换到另一个屏幕并返回“主页”时,“主页”屏幕上的所有数据都消失了。它没有显示任何数据。我想保存它的状态。现在我想将该 ViewController 保留在堆栈中,以便当我回到此 <code>viewcontroller</code> 时,它仍保留在堆栈中,而其他 ViewController 刚刚弹出。请解释我该怎么做?</p >

<p>我正在使用下面的代码。</p>

<pre><code>-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell=;
    if(indexPath.row==0)
    {
      ;
      ;
    }

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

    else if(indexPath.row==2)
    {
      ;
    }
    else if(indexPath.row==3)
    {
      ;
    }

}

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    NSLog(@&#34;Segue&#34;);
    NSIndexPath *indexPath = ;
    UINavigationController *destViewController = (UINavigationController*)segue.destinationViewController;
    destViewController.title = [ capitalizedString];
   if()
    {
      self.revealViewController.navigationItem.title = @&#34;settings&#34;;

    }
    elseif()
    {
      self.revealViewController.navigationItem.title = @&#34;help&#34;;
    }
    elseif()
    {
      self.revealViewController.navigationItem.title = @&#34;about&#34;;
    }

    if(])
    {
      SWRevealViewControllerSegue *swSegue = (SWRevealViewControllerSegue*) segue;

      swSegue.performBlock = ^(SWRevealViewControllerSegue* rvc_segue, UIViewController* svc, UIViewController* dvc) {
            UINavigationController* navController = (UINavigationController*)self.revealViewController.frontViewController;
             animated: NO ];
            ;



      };

    }

}
</code></pre>

<p>编辑:</p>

<p>它在下面的代码中尝试过,如果我在“主页”和其他屏幕之间切换两次,它就可以工作。</p>

<pre><code>-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell=;
    if(indexPath.row==0)
    {
      if(objMainController != nil)
      {
            UINavigationController* navController = (UINavigationController*)self.revealViewController.frontViewController;
             animated: NO ];
            ;
      }
      else
      {
            ;
            ;
      }

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

      ;
    }
    else if(indexPath.row==2)
    {

      ;
    }
    else if(indexPath.row==3)
    {

      ;
    }


}
</code></pre>

<p><strong>准备继续</strong></p>

<pre><code>- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    NSLog(@&#34;Segue&#34;);
    NSIndexPath *indexPath = ;
    UINavigationController *destViewController = (UINavigationController*)segue.destinationViewController;
    destViewController.title = [ capitalizedString];
   if()
    {
      self.revealViewController.navigationItem.title = @&#34;settings&#34;;

    }
    elseif()
    {
      self.revealViewController.navigationItem.title = @&#34;about&#34;;
    }
    elseif()
    {
      self.revealViewController.navigationItem.title = @&#34;help&#34;;
    }


    if(])
    {
      SWRevealViewControllerSegue *swSegue = (SWRevealViewControllerSegue*) segue;

      swSegue.performBlock = ^(SWRevealViewControllerSegue* rvc_segue, UIViewController* svc, UIViewController* dvc) {
            UINavigationController* navController = (UINavigationController*)self.revealViewController.frontViewController;
            if()
            {
                objMainController = (MainViewController*)destViewController;
                self.revealViewController.navigationItem.title = @&#34;home&#34;;
                animated: NO ];
            }
            else
            {
                animated: NO ];

            }

            ;
      };

    }

}
</code></pre></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>每次执行 segue 时,都会在 <code>destinationViewController</code> 内为您创建一个新的 <code>UIViewController</code> 实例,并且在创建后您需要保留对它的引用(首先时间)。</p>

<h3>步骤#1</h3>

<p>保留对您需要保存状态的所有 <code>UIViewController</code> 实例的引用-</p>

<pre><code>SettingsViewController* objSettingsVC;
</code></pre>

<h3>步骤 #2</h3>

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

<pre><code>- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell* cell = ;

    if(indexPath.row == 1)
    {
      if(objSettingsVC != nil)
      {
            UINavigationController* navController = (UINavigationController*)self.revealViewController.frontViewController;
             animated: NO ];
            ;
      }
      else
      {
            ;
      }
    }
}
</code></pre>

<h3>步骤#3</h3>

<p>将 <code>UIViewController</code> 实例保存在变量中,以便稍后在 <code>prepareForSegue:</code> -</p> 中第一次创建它时引用它

<pre><code>- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    UINavigationController* destViewController = (UINavigationController*)segue.destinationViewController;

    if()
    {
      objSettingsVC = (SettingsViewController*)destViewController;
      self.revealViewController.navigationItem.title = @&#34;Settings&#34;;
    }
}
</code></pre>

<p>希望对你有帮助。</p>

<h2>更新:</h2>

<p>正如下面评论中所讨论的,您还需要将 <code>initialViewController</code> 实例保存在一个变量中。以下是你可以做到的。</p>

<h3>AppDelegate.h</h3>

<pre><code>#import &lt;UIKit/UIKit.h&gt;
#import &#34;ViewController.h&#34;

@interface AppDelegate : UIResponder &lt;UIApplicationDelegate&gt;

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


@end
</code></pre>

<h3>ViewController.m</h3>

<pre><code>#import &#34;ViewController.h&#34;
#import &#34;AppDelegate.h&#34;

@interface ViewController ()

@end

@implementation ViewController

-(void)viewDidLoad
{
   ;

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


@end
</code></pre>

<p>这不是一个很好的方法,但它会让你继续前进。你的 AppDelegate 不应该是所有这些导航逻辑的一部分,你应该把它保存在一个单独的对象中,负责你的应用程序导航。也许你的 <code>SideTableViewController</code> 在你的情况下。</p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 在 iOS 的 SWRevealController 中保持 ViewController 的保存状态?,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/37940017/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/37940017/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 在 iOS 的 SWRevealController 中保持 View Controller 的保存状态?