如何使用展开Segue将数据从第二个视图控制器传回第一个视图控制器?

时间:2016-10-29 06:25:39

标签: ios objective-c delegates viewcontroller unwind-segue

我创建了两个视图控制器。第一个视图控制器向第二个视图控制器发送一个名称,该名称用于向用户表示问候,并以英寸为单位提示用户身高。

我遇到的问题是将高度信息从第二个视图控制器发送回第一个视频控制器,这样我就可以进行转发,我必须对未来的数据进行转换,以便在第一个视图控制器中显示它

在我的第二个视图控制器(.h文件)中,我创建了一个属性,我正在使用我的prepareForSegue方法中的目标方法(我认为它是一个方法),我用它来将nameField信息发送到第二个查看控制器。它看起来像这样:

SecondSceneViewController.h中的

属性

#import <UIKit/UIKit.h>

//specifying delegate protocol

@interface SecondSceneViewController : UIViewController
@property (strong, nonatomic) NSString *labelText;

@end

我的FirstSceneViewController.m文件中的prepareForSegue方法如下所示:

#import "FirstSceneViewController.h"

@interface FirstSceneViewController ()
@property (weak, nonatomic) IBOutlet UITextField *nameField;
@property (weak, nonatomic) IBOutlet UIButton *goToScene2Btn;
@property (weak, nonatomic) IBOutlet UITextField *displayField;
@property (weak, nonatomic) NSString *heightInches;

@end

@implementation FirstSceneViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    //bring data back from scene2
}


- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    SecondSceneViewController *destination = [segue destinationViewController];
    destination.labelText = self.nameField.text;
}

-(IBAction)goBackToScene1:(UIStoryboardSegue *)segue
{
    //Hello, Adnan, you are 6'3 which is 191cm
    self.displayField.hidden = NO;
    self.displayField.text = [NSString stringWithFormat:@"Hello, %@, you are %@ inches", self.nameField.text, self.heightInches]; //EXAMPLE OUTPUT
}


@end

这是我的SecondSceneViewController.m文件带来名称数据的方式:

#import "SecondSceneViewController.h"

@interface SecondSceneViewController ()
@property (weak, nonatomic) IBOutlet UILabel *greetingLabel;
@property (weak, nonatomic) IBOutlet UITextField *heightField;


@end

@implementation SecondSceneViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.

    //display name collected from scene1 held as strong var labelText
    self.greetingLabel.text = [NSString stringWithFormat:@"Hello, %@", self.labelText];
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}


/*
#pragma mark - Navigation

// In a storyboard-based application, you will often want to do a little preparation before navigation
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    // Get the new view controller using [segue destinationViewController].
    // Pass the selected object to the new view controller.
}
*/



@end

我读过的东西建议使用协议&amp;委托在我的FirstSceneViewController中使用unwind方法使第一个场景成为第二个场景的委托,以便将高度数据带回第一个场景。

我应该在第二个场景视图控制器中设置一个动作来获取高度数据,以便将它设置为labelText,这样我就可以在第一个场景视图控制器中通过标签文本使用数据吗?

我在考虑这样的事情:

self.labelText = self.heightField.text;

然后,我在想,因为labelText现在保存来自第二个场景的数据,我可以只使用viewDidLoad方法来获取labelText数据并将其放入我在第一个场景视图控制器中的变量中像这样:

self.heightInches = self.labelText;

不幸的是,上述策略并没有奏效......

我已经尝试过关于堆栈溢出的每个相关问题的解决方案,但我已经走到了死胡同,我不明白这个过程是如何工作的。

任何人都可以帮助我找出解决方案吗?

如果要重新创建问题,请输入以下项目链接:

https://www.dropbox.com/s/g69i13uh0e1q5e9/2658.ICW01.zip?dl=0

我正在尝试使用展开segue将数据传回第一个视图控制器。有没有人知道如何正确实现这个功能?

我的goBackToScene1是我的unwind segue。我遇到的主要问题是使用此展开segue将数据从第二个场景发送回第一个场景。我使用变量labelText将数据从第一个场景发送到第二个场景,但现在我正在努力找出使用相同的展开segue将其发回的正确语法。

如何使用名为goBackToScene1的unwind segue将数据从第二个视图控制器发送回第一个视图控制器?

* UPDATE *** *** UPDATE UPDATE *

所以我继续尝试解决这个问题,这是我到目前为止所做的:

  1. 我从同一个按钮创建了一个辅助连接,触发我的展开segue到我的SecondSceneViewController.m文件中的一个动作。
  2. 以下是故事板连接的图片:

    Action connection to storyboard

    此操作的代码将我的labelText变量设置为我的SecondSceneViewController.h文件中的属性,该变量由用户输入的heightInches数据。这是我的SecondSceneViewController.m文件的代码,我尝试使用带有sendHeightToDestinationBtn操作的heightField来操作labelText中的数据:

    #import "SecondSceneViewController.h"
    
    @interface SecondSceneViewController ()
    @property (weak, nonatomic) IBOutlet UILabel *greetingLabel;
    @property (weak, nonatomic) IBOutlet UITextField *heightField;
    
    
    @end
    
    @implementation SecondSceneViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        // Do any additional setup after loading the view.
    
        //display name collected from scene1 held as strong var labelText
        self.greetingLabel.text = [NSString stringWithFormat:@"Hello, %@", self.labelText];
    }
    
    - (void)didReceiveMemoryWarning {
        [super didReceiveMemoryWarning];
        // Dispose of any resources that can be recreated.
    }
    - (IBAction)sendHeightToDestinationBtn:(UIButton *)sender {
        self.labelText = self.heightField.text;
    }
    

    这是我的SecondSceneViewController.h文件中的代码,显示了我的labelText @property:

    @interface SecondSceneViewController : UIViewController
    @property (strong, nonatomic) NSString *labelText;
    
    @end
    
    1. 然后我在我的FirstSceneViewController中的prepareForSegue操作中重写了代码,以便在我调用的unwind segue中相应地使用它:goBackToScene1。这是我的FirstSceneViewController.m文件的代码:

      import&#34; FirstSceneViewController.h&#34;

      @interface FirstSceneViewController() @property(弱,非原子)IBOutlet UITextField * nameField; @property(弱,非原子)IBOutlet UIButton * goToScene2Btn; @property(弱,非原子)IBOutlet UITextField * displayField; @property(弱,非原子)NSString * heightInches;

      @end

      @implementation FirstSceneViewController

      • (void)viewDidLoad { [super viewDidLoad]; //在加载视图后进行任何其他设置,通常是从笔尖。 //从scene2返回数据 }

      • (void)didReceiveMemoryWarning { [super didReceiveMemoryWarning]; //处理可以重新创建的任何资源。 }

      - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {     if([segue.sourceViewController isKindOfClass:[FirstSceneViewController class]])     {         SecondSceneViewController * destination = [segue destinationViewController];         destination.labelText = self.nameField.text;     }     else if([segue.sourceViewController isKindOfClass:[SecondSceneViewController class]])     {         SecondSceneViewController * source = [segue destinationViewController];         self.heightInches = source.labelText;     }

      }

      - (IBAction)goBackToScene1:(UIStoryboardSegue *)segue {     //你好,阿德南,你是6岁,身高是191厘米     self.displayField.hidden = NO;

      self.displayField.text = [NSString stringWithFormat:@"Hello, %@, you are %@ inches", self.nameField.text, self.heightInches]; //EXAMPLE OUTPUT
      

      }

      @end

    2. 正如您所看到的,我正在尝试使用prepareForSegue来确定何时使用我尝试使用的labelText变量,以便传递我需要来回传递的数据,但我只能从第一次开始工作查看控制器到第二个而不是反向。

      1. 这是unwind segue完成后的输出。
      2. Program Output

        从输出中我可以看到我试图从第二个场景传递的数据,这是我试图通过labelText从SecondSceneViewController输出中的heightField传递给(null)...

        如何在此变量中获取正确的数据?我知道我没有根据输出正确使用unwind segue ...

        如何找到正确解决此问题的策略?

        请帮忙!

        感谢。

1 个答案:

答案 0 :(得分:1)

你几乎拥有它。你有unwind segue方法,你只是没有使用它。您可以通过传递给展开方法的segue的sourceViewController属性访问第二个视图控制器:

-(IBAction)goBackToScene1:(UIStoryboardSegue *)segue
{
    //Hello, Adnan, you are 6'3 which is 191cm
    self.displayField.hidden = NO;
    SecondSceneViewController *source = (SecondSceneViewController *)segue.sourceViewController;
    self.heightInches = source.heightField.text
    self.displayField.text = [NSString stringWithFormat:@"Hello, %@, you are %@ inches", self.nameField.text, self.heightInches]; //EXAMPLE OUTPUT
}