【问题标题】:My NSString data didnt tranfer over to a view controller我的 NSString 数据没有传输到视图控制器
【发布时间】: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 如果有人可以查看它并了解您如何将其应用于我的情况,我将不胜感激。

【问题讨论】:

    标签: ios objective-c cocoa-touch nsstring viewcontroller


    【解决方案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;
    }
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多