可以将现有的ViewController与PerformSegueWithIdentifier一起使用吗?

mat*_*ino 16 objective-c storyboard uiviewcontroller ios5

我使用该方法performSegueWithIdentifier:sender:ViewController编程方式从storyboard文件中打开一个新的.这就像一个魅力.

但是每次调用此方法时,ViewController都会创建一个new .是否可以使用现有的ViewController,如果存在的话?我没有找到任何关于这个问题的东西(apple-doc,Stack Overflow,...).

问题是:在创建ViewController的用户设置一些表单元素,如果ViewController再次调用,表单元素具有初始设置:(

任何帮助,将不胜感激.

编辑:我很欣赏很多回复.同时,我不熟悉这个项目,也无法检查你的答案.

小智 12

使用shouldPerforSegueWithIdentifier来允许segue执行或取消segue并手动添加ViewController.在prepareForSegue中保留一个指针.

...标题

@property (strong, nonatomic) MyViewController *myVC;
Run Code Online (Sandbox Code Playgroud)

......实施

-(BOOL) shouldPerformSegueWithIdentifier:(NSString *)identifier sender:(id)sender{
    if([identifier isEqualToString:@"MySegueIdentifier"]){
        if(self.myVC){
            // push on the viewController
            [self.navigationController pushViewController:self.myVC animated:YES];
             // cancel segue
            return NO; 
        }
    }
    // allow the segue to perform
    return YES;
}


-(void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if([segue.identifier isEqualToString:@"MySegueIdentifier"]){
        // this will only be called the first time the segue fires for this identifier
        // retian a pointer to the view controller
        self.myVC = segue.destinationViewController;
    }
}
Run Code Online (Sandbox Code Playgroud)


Zde*_*nek 8

要使用UIViewControllersegue 重用现有实例,请从头开始创建segue并提供您自己的(现有)目标(UIViewController).prepareForSegue:如果需要,别忘了打电话.

例如:

UIStoryboardSegue* aSegue = [[UIStoryboardSegue alloc] initWithIdentifier:@"yourSegueIdentifier" source:self destination:self.existingViewController]
[self prepareForSegue:aSegue sender:self];
[aSegue perform];
Run Code Online (Sandbox Code Playgroud)


d.l*_*dev 0

为控制器创建一个属性。

@property (nonatomic, weak) MyController controller;
Run Code Online (Sandbox Code Playgroud)

并使用某种延迟初始化performSegueWithIdentifier:sender

if (self.controller == nil)
{
self.controller = [MyController alloc] init]
...
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,如果控制器已经创建,它将被重用。