如何从已解散的导航控制器中的文本视图中捕获最终值

Posted

技术标签:

【中文标题】如何从已解散的导航控制器中的文本视图中捕获最终值【英文标题】:How can i capture final value from text view in dismissed navigation controller 【发布时间】:2016-04-26 21:42:45 【问题描述】:

我有一个导航控制器,里面有 2 个视图控制器。viewController(A) 和 viewController(B)。

在 ViewController(A) 中,我的代码定义了 ViewController(B) 的左右导航项,然后将其推送到导航堆栈上。 演示者 viewController(A) 中的代码显示在此处...

-(void)presentImageEditor
    
        IGCellPath *pathForCurrentCell = [self pathForCurrentCell];
        iRpImageAndMedia *imageAndMediaItem = [thePropertyImageSet objectAtIndex:pathForCurrentCell.columnIndex];

        iRpImageEditorViewController *viewControllerB = [[iRpImageEditorViewController alloc] initWithImageAndMediaItem:imageAndMediaItem];

        viewControllerB.navigationItem.title = @"Photo Details Editor";
        viewControllerB.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(imageEditorDone)];
        viewControllerB.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCancel target:self action:@selector(imageEditorCancelled)];
        viewControllerB.edgesForExtendedLayout = UIRectEdgeNone;

        [imageEditorNavController pushViewController:viewControllerB animated:YES];
    


-(void)imageEditorDone
    
        [imageEditorNavController popViewControllerAnimated:YES];
        [[iRpDatabase sharedInstance] saveChangesToDatabase];
    


-(void)imageEditorCancelled
    
        [imageEditorNavController popViewControllerAnimated:YES];
        [[iRpDatabase sharedInstance] rollbackChangesToDatabase];
    

我呈现的视图控制器中的代码... viewController(B) 有这个...

-(void)textViewDidEndEditing:(UITextView *)textView

    if (textView == descriptionView)
    
        [theImageAndMediaItem.mediaManagedObj setValue:textView.text forKey:@"desc"];
    

问题是,在呈现的视图控制器 viewController(B) 中,当他们关闭 viewController(B) 时,viewController(A) -(void)imageEditorDone 在此呈现的视图控制器内的 viewController(B) -(void)textViewDidEndEditing:(UITextView *)textView 方法之前触发... viewController(B) .所以我不能在他们关闭视图控制器之前捕获他们的最后一个条目并保存它,因为事件发生的顺序错误。 我原以为您实际使用的视图控制器会在呈现的视图控制器触发其事件 -(void)imageEditorDone 之前触发它的事件 -(void)textViewDidEndEditing:(UITextView *)textView

如何确保在演示者代码触发以将其关闭之前捕获他们在呈现视图中所做的最后一件事?

【问题讨论】:

【参考方案1】:

如何交换这些方法?

   [imageEditorNavController popViewControllerAnimated:YES];
   [[iRpDatabase sharedInstance] saveChangesToDatabase];

【讨论】:

不幸的是,问题比那更进一步......首先调用imageEditorDone方法,然后调用textViewDidEndEditing......所以即使交换你的建议也不会捕获足够早的新文本值:( 比在你的vc中添加你的UIBarButtons和文本并将你的数据保存在它的方法中。 -(void)imageEditorDone [theImageAndMediaItem.mediaManagedObj setValue:self.textView.text forKey:@"desc"]; [[iRpDatabase sharedInstance] saveChangesToDatabase]; [self.navigationController popViewControllerAnimated:YES]; 我会研究这个选项。谢谢。【参考方案2】:

根据对亚历克斯帖子的评论中的建议,这就是我为使其发挥作用所做的工作。我试图编辑他对他的评论建议(这是正确的)的原始答案(这是错误的),试图将答案归功于他,但他拒绝了我的编辑,lololool。

我没有在 viewController(A) 中添加条形按钮项和在 viewController(A) 中的关联处理程序,而是在 viewController(B) 中添加了条形按钮项(和关联处理程序),以便我可以将数据保存在viewController(B) 在它被解除之前。

所以在 viewController(B) 中,也许在 init 方法中,我这样做了...

self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(imageEditorDone)];
self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCancel target:self action:@selector(imageEditorCancelled)];

然后在你的处理程序中,你可以做这样的事情......

-(void)imageEditorDone

    [self.view endEditing:YES];

    // Save your data here...

    [self.navigationController popViewControllerAnimated:YES];



-(void)imageEditorCancelled

    [self.view endEditing:YES];
    [self.navigationController popViewControllerAnimated:YES];

【讨论】:

以上是关于如何从已解散的导航控制器中的文本视图中捕获最终值的主要内容,如果未能解决你的问题,请参考以下文章

如何关闭相机并导航到根视图控制器?

导航栏将文本视图中的文本向下移动 2 倍其高度

在基于导航控制器的应用程序的最终视图中隐藏或禁用后退按钮

如何按下 tableview 单元格以在导航控制器中显示带有文本的视图控制器

iOS:关闭时视图控制器未释放

UIActivityViewController 不解散