gpt4 book ai didi

iphone - Storyboard 正在创建我的 DetailViewController 的多个实例

转载 作者:行者123 更新时间:2023-12-03 21:02:44 25 4
gpt4 key购买 nike

我开始使用 Storyboard,但注意到一个非常显着的区别:每次我来回导航时, Storyboard似乎都会实例化一个新的 ViewController。示例:我基于 Master-Detail 模板创建了两个新的 Xcode 项目。在案例 1 中,我使用 Storyboard,在案例 2 中我使用 .xib。

通常我希望它们的行为相同,但事实并非如此!

在两个 DetailViewController.m 中,我添加以下方法:

-(void)viewDidAppear:(BOOL)animated{
if (xposition ==0) {
xposition=50;
}else{
xposition = xposition+50;
}
NSLog(@"xposition update %d", xposition);

}

(我还在标题中将 xposition 声明为“int”实例变量):

当我运行 Storyboard 版本并点击“+”并导航进出 DetailViewController 时,我的 NSLog 语句不断给出“xposition update 50”。

相比之下,对于 .xib 版本,我得到了预期的行为,每次导航进出 DetailViewController 时,“位置”都会增加 50:所以 50、100、150 等。

如何修复 Storyboard 以使其行为方式与基于 .xib 的版本相同。具体来说,我只想实例化 DetailViewController 一次。

编辑:回答我自己的问题。我在这方面得到了一些帮助,并想发布对我有用的答案。

当您第一次执行segue时,将目标 View Controller 存储在属性中(请参阅方法“PrepareForSegue”。我的VC称为MyViewController)

然后创建名为“shouldPerformSegueWithIdentifier”的委托(delegate)方法,并使用它来拦截 Segue 并为所有后续 Segue 手动呈现存储的 ViewController。

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
UIViewController *destination = segue.destinationViewController;
NSLog(@"identifier = %@", [segue identifier]);
if([[segue identifier] isEqualToString:@"mySegue"]) {
self.myViewController = (MyViewController*)destination;
NSLog(@"Saving myViewController for later use.");
}}

- (BOOL)shouldPerformSegueWithIdentifier:(NSString *)identifier sender:(id)sender {
if([identifier isEqualToString:@"mySegue"]) {
if(self.myViewController != nil) {
NSLog(@"Using the saved myViewController.");
[self.navigationController pushViewController:self.myViewController animated:YES];
return NO;
}else {
return YES;
}
}
return YES;}

最佳答案

当您来回导航时, Storyboard会从 DetailViewController 中弹出。因为它没有被其他任何东西保留,所以它会被释放,这是正常行为。

如果您想保留该实例,则必须将其保留在调用它的 ViewController 中,并在以后再次使用它。检查此问题是否有 example

编辑:

我认为您解决了问题,但这里有一个例子:

在界面中为 View Controller 创建一个属性,例如myViewController

在prepareForSegue方法中保留viewcontroller:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
[self setMyViewController:[segue destinationViewController]];
}

这不会泄漏内存,您的示例在某些情况下可能会泄漏。查看本指南 here .

下次执行序列时,检查该属性是否已设置,如果已设置,则使用它:

- (BOOL)shouldPerformSegueWithIdentifier:(NSString *)identifier sender:(id)sender {
if([self myViewController] != nil){
[[self navigationController] pushViewController:[self myViewController] animated:YES];
return NO;
}else{
return YES;
}
}

关于iphone - Storyboard 正在创建我的 DetailViewController 的多个实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13185754/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com