认为没有在ViewControllers之间传递数据

时间:2015-10-10 02:20:52

标签: ios objective-c iphone ios9

我正在制作一款使用付款方式的iOS应用。

目前我正在尝试使用结帐流程,其中包含一个OderFormViewController和一个CheckoutTableViewController,如下所示:

enter image description here

我通过拖动一个segue连接两个,以蓝色突出显示。我还为我的segue添加了一个segue标识符。

我将第一个视图控制器调用为E_OrderFormViewController(标题为送货地址),其中我为“继续”按钮创建了IBAction,并使用-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender传入信息。

我也有一个Order模型,里面有一些属性。在我的CheckoutTableViewController上,我将标签和orderInfo作为公共属性,因此第一个视图控制器可以访问它。

#import <Foundation/Foundation.h>

@interface Order : NSObject

@property(strong, nonatomic) NSString *shippingName;
@property (strong, nonatomic) NSString *shippingAddress;
@property (strong, nonatomic) NSString *shippingCity;
@property(strong, nonatomic) NSString *shippingState;
@property(strong, nonatomic) NSString *shippingZip;


@end


//E_OrderFormViewController.m

#import "E_OrderFormViewController.h"
#import "F_CheckoutTableViewController.h"

...

#pragma mark - My Actions
- (IBAction)storePaymentInfoProceedToConfirmation:(id)sender {
  [self performSegueWithIdentifier:@"toCheckout" sender:self];
}

#pragma mark - Navigation
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{

  if ([[segue identifier] isEqualToString:@"toCheckout"]) {
    F_CheckoutTableViewController *checkoutView = segue.destinationViewController;

    //Store Information and pass it to next view
    checkoutView.orderInfo.shippingName = self.txtFieldNameOnCard.text;

    NSLog(@"Shipping Name Stored: %@",checkoutView.orderInfo.shippingName);
  }

}

对于我在第一个textField中输入的任何文本,我的NSLog总是返回(null),这是我首先测试的文本。

这是我的CheckoutTableViewController及其公共财产。此处列出orderInfo。我正在使用它来传递信息,如上所述:

//F_CheckoutTableViewController.h

#import <UIKit/UIKit.h>

@interface F_CheckoutTableViewController : UITableViewController

@property (strong, nonatomic)Order *orderInfo;

@end

viewDidLoad上,在我的目标视图控制器上,我做了:

//F_CheckoutTableViewController.m

@implementation F_CheckoutTableViewController

- (void)viewDidLoad {
    [super viewDidLoad];

  //Load all information

  self.labelShippingName.text = self.orderInfo.shippingName;

  NSLog(@"Typed Name: %@",self.orderInfo.shippingName);

}

我刚刚粘贴了viewDidLoad作为参考,因为我知道如果我NSLog中的prepareForSegue没有返回任何内容,则信息未被传递。

我真的不知道错误在哪里。我在StackOverFlow上搜索了几个主题,但是没有一个主题对我有帮助,一个看似相似的,就是这个,但它对我的问题没有帮助:

Multiple segues not passing Object data between themselves

这似乎很简单,但我犯了一些我找不到的错误。

我非常感谢你的帮助。

1 个答案:

答案 0 :(得分:1)

orderInfo必须为null,因为您没有初始化它,因此您无法设置其属性...所以您有2个选项:

checkoutView.orderInfo = [[OrderInfo alloc]init];
checkoutView.orderInfo.shippingName = self.txtFieldNameOnCard.text;

或更改您的财产:

@property (strong, nonatomic)Order *orderInfo;

为:

@property (strong, nonatomic)NSString *shippingName ;