如何在不重置其当前状态的情况下从一个视图控制器到自身进行转场?

Posted

技术标签:

【中文标题】如何在不重置其当前状态的情况下从一个视图控制器到自身进行转场?【英文标题】:How to make a segue from one viewcontroller to itself without resetting its current state? 【发布时间】:2014-02-11 17:48:41 【问题描述】:

实际上,我确实通过使用隐藏按钮和另一个进行 segue 的按钮从我的视图控制器到自身创建了一个 segue。只是为了澄清起见,假设我想通过使用 segue 来更改视图背景颜色。这里的问题是视图返回到它的第一个状态,就好像我再次运行它一样,因为它通过了 viewdidload 和 viewdidappear 等等。 有没有一种方法或解决方法可以让我从我的视图的最后状态继续?

例如,我需要在此代码中添加什么:

- (IBAction)changeColor:(id)sender 
    [self performSegueWithIdentifier:@"changeC" sender:self];


- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender

    ViewController* controller = [segue destinationViewController];

    controller.view.backgroundColor = [UIColor blueColor];   

【问题讨论】:

你为什么要转投同一个VC? 【参考方案1】:

我什至不会问你为什么真的想要这样做,但你可以有一个像 shouldReloadView 这样的 BOOL,然后在 prepareForSegue: 中将其设置为 NO。然后,在 viewDidLoadviewWillAppear 中,只需在进行任何设置之前检查该 BOOL。

【讨论】:

感谢 sfeuerstein 的快速回复。我知道我在这里尝试实现的想法有点奇怪,但我这样做是为了学习。很抱歉,如果可能的话,我将不得不打扰您以获得更多解释,因为我是新手。 在您的 .h 文件中添加:@property (assign, nonatomic) BOOL shouldReloadView;然后在您的 prepareForSegue 方法中,添加:controller.shouldReloadView = NO;最后,在您的 viewDidLoad 和 viewWillAppear 中检查是否 _shouldReloadView,并且仅在 BOOL 为 true 时再次设置视图。希望有帮助! 就更好的做法而言,您可以添加一个方法来隐藏 viewController 中的视图,重新加载您需要在其中重新加载的任何内容(例如更改颜色),然后再次显示它。这样,在重新加载视图时,您甚至不必弄乱 segue。【参考方案2】:

最好的方法是在你的头文件中添加一个颜色变量:

 @property (nonatomic, strong) UIColor *backgroundColor;

然后在实现文件中自定义init函数需要一个UIColor。

然后忘记转场,只需执行以下操作。

  YourViewController *viewController = [[YourViewController alloc] initWithBackgroundColor:[UIColor someColor]];

  [self.navigationController pushViewController:YourViewController animation:YES];

等等,瞧。

【讨论】:

谢谢 Mikael,但这不是我想要实现的目标。这不是关于改变颜色。这就像有一个在 viewdidload 中创建的 webview,然后每次运行项目时都会出现在您的视图中。例如,我希望能够通过 segue 重新加载我的视图控制器并隐藏该 webview。这不是我正在做的事情,而是想法本身是否可能或没有任何意义。【参考方案3】:

@sfeuerstein 是正确的 根据他的建议

- (IBAction)changeColor:(id)sender 
[self performSegueWithIdentifier:@"changeC" sender:self];


- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender

   ViewController* controller = [segue destinationViewController];

   controller.state = YES;  // set bool value in your controller state

检查您的视图控制器

-(void)ViewDidLoad  

if(NewState)
    controller.view.backgroundColor = [UIColor blueColor]; 
   
else
   controller.view.backgroundColor = [UIColor whiteColor]; 
   

但我仍然不知道,你为什么要尝试做这样的事情。它不是好方法。

【讨论】:

谢谢帕万。尽管我是新手,但我可以看到这不是一个好方法,但我正在尝试探索它,看看我是否可以在我的应用程序中使用它。

以上是关于如何在不重置其当前状态的情况下从一个视图控制器到自身进行转场?的主要内容,如果未能解决你的问题,请参考以下文章

如何在不知道当前/主视图是啥的情况下从后台线程打开新视图?

如何在不使用 foreach 循环的情况下从视图访问模型

如何在不使用导航栏的情况下从导航堆栈中弹出控制器

如何在不使用 NavigationController 的情况下从一个视图导航到另一个视图?

如何让 GraphQL 在不进行轮询的情况下从数据库中获取实时/新数据?

在不知道当前视图状态的情况下实现 openURL