我的 NSString 数据没有传输到视图控制器

Posted

技术标签:

【中文标题】我的 NSString 数据没有传输到视图控制器【英文标题】:My NSString data didnt tranfer over to a view controller 【发布时间】:2013-09-01 01:15:12 【问题描述】:

在我的应用程序中,我使用的是导航控制器。我的问题是,当我转到上一个视图(使用生成的导航后退按钮)时,我的 NSString 数据不会传输过来。当我从导航控制器浏览堆栈时,我不知道如何保存这些 NSString 值。我需要发送一封包含这些 NSString 值的电子邮件。

这是我按下返回按钮之前的视图控制器

-(void)button
    NSString *dd = @"text";
    viewcontroller.string = dd;

这是按下后退按钮后的前一个控制器(视图控制器)

.h

@property (strong,nonatomic) NSString *string;

.m

NSString *emailBody = [NSString stringWithFormat:@"%@  ", string];

另外,我发现这个问题与我的情况相似,我围绕它来模拟我的问题。 UITextField contents are empty after popViewControllerAnimated 如果有人可以查看它并了解您如何将其应用于我的情况,我将不胜感激。

【问题讨论】:

【参考方案1】:

您应该使用delegation:较早的(概述)控制器(您导航回的那个)应该实现详细视图控制器定义的协议。较早的控制器将在呈现之前将自己设置为详细控制器的委托。当被呈现并从细节控制器导航回概览控制器即将发生时,细节控制器可以在概览控制器被解除之前通知(也就是发送包含字符串作为参数对象的消息)概览控制器。

【讨论】:

对不起,我对委派有点菜鸟。您可以使用我的代码(或类似代码)提供示例吗?我将非常感激它,但是如果这需要您花费太多时间,您不必这样做。我会研究它,但可能需要一段时间才能弄清楚。 我这里是凌晨 5 点。所以如果我明天找到对你有用的代码,我会看看。但是对于您的代码而言,您的详细控制器知道前一个控制器。这似乎是一种相互依赖,你应该尽一切努力避免它。通过委托,只有概览控制器会知道细节控制器。而细节控制器只知道通信合同——它的委托履行的协议。【参考方案2】:

我同意 vikingosegundo 的观点,委派是处理这个问题的最佳方式。我建议你阅读这篇文章:click here

但有出路,

在您的子视图控制器中:

- (void)viewDidLoad

    [super viewDidLoad];
    UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:@"back"                                                                 style:UIBarButtonItemStyleBordered
                                                                  target:self
                                                                  action:@selector(goBack:)];

    self.navigationItem.leftBarButtonItem = backButton;


- (void) goBack:(id)sender

    NSArray *vcs = self.navigationController.viewControllers;
    id parentVC = [vcs objectAtIndex:[vcs count] - 2];
    if ([parentVC respondsToSelector:@selector(getStringFromChildVC:)])
        [parentVC getStringFromChildVC:@"text"];
    [self.navigationController popToRootViewControllerAnimated:YES];

在您的父视图控制器.h 文件中:

-(void)getStringFromChildVC:(NSString *)myString;

和.m文件

-(void)getStringFromChildVC:(NSString *)myString

    self.string = myString;

就这样吧..不过还是建议大家学习一下委托。

【讨论】:

以上是关于我的 NSString 数据没有传输到视图控制器的主要内容,如果未能解决你的问题,请参考以下文章

UIScrollViews 不会滚动到我的应用程序结构的顶部

在视图控制器之间传递数据而没有 segues

需要帮助将多个字符串从一个 .XIB 文件传输到视图控制器

请为 MVC3 命名一些教程,它显示了从控制器到视图的数据传输

管理多个视图控制器和数据

使用 NSString 作为超链接