【问题标题】:Segue not passing data between ViewControllersSegue 不在 ViewController 之间传递数据
【发布时间】:2015-10-10 02:20:51
【问题描述】:

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

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

我通过拖动一个 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);
  }

}

我的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

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

非常感谢您的帮助。

【问题讨论】:

    标签: ios objective-c iphone ios9


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

    【讨论】:

    • 好收获。他还应该检查self.txtFieldNameOnCard.text实际上有内容,可能插座没有从IB连接。
    • 你能用 Swift 翻译吗,我也需要这方面的帮助!
    • 嗨@meda,非常感谢。我初始化了属性,它工作正常。
    • 另外@jere,感谢您的提示,我还检查了 IB。都是好人。
    【解决方案2】:

    根据情节提要设置,您在发货地址视图控制器中使用 Textfield,它可能会错过 Textfield 对其控制器的委托。

    【讨论】:

      猜你喜欢
      • 2016-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-24
      • 2017-01-22
      • 2019-12-05
      • 1970-01-01
      • 2017-12-09
      相关资源
      最近更新 更多