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(@"Segue");
NSIndexPath *indexPath = ;
UINavigationController *destViewController = (UINavigationController*)segue.destinationViewController;
destViewController.title = [ capitalizedString];
if()
{
self.revealViewController.navigationItem.title = @"settings";
}
elseif()
{
self.revealViewController.navigationItem.title = @"help";
}
elseif()
{
self.revealViewController.navigationItem.title = @"about";
}
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(@"Segue");
NSIndexPath *indexPath = ;
UINavigationController *destViewController = (UINavigationController*)segue.destinationViewController;
destViewController.title = [ capitalizedString];
if()
{
self.revealViewController.navigationItem.title = @"settings";
}
elseif()
{
self.revealViewController.navigationItem.title = @"about";
}
elseif()
{
self.revealViewController.navigationItem.title = @"help";
}
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 = @"home";
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 = @"Settings";
}
}
</code></pre>
<p>希望对你有帮助。</p>
<h2>更新:</h2>
<p>正如下面评论中所讨论的,您还需要将 <code>initialViewController</code> 实例保存在一个变量中。以下是你可以做到的。</p>
<h3>AppDelegate.h</h3>
<pre><code>#import <UIKit/UIKit.h>
#import "ViewController.h"
@interface AppDelegate : UIResponder <UIApplicationDelegate>
@property (strong, nonatomic) UIWindow *window;
@property (strong, nonatomic) ViewController *objMainController;
@end
</code></pre>
<h3>ViewController.m</h3>
<pre><code>#import "ViewController.h"
#import "AppDelegate.h"
@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]