[英]Storyboard Segue vs Delegation. Which method is better for passing data between ViewControllers
[英]Segue not passing data between ViewControllers
我正在制作使用付款方式的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);
}
}
無論我在第一個textField中鍵入的任何文本,我的NSLog
始終返回(空),這是我首先測試的文本。
這是我的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
粘貼為參考,因為我知道我的prepareForSegue
NSLog
沒有返回任何信息,信息也沒有傳遞。
我真的不知道錯誤在哪里。 我在StackOverFlow上搜索了幾個線程,但沒有一個對我有幫助,看起來很相似的一個是這個,但它對我的問題沒有幫助:
這似乎很簡單,但是我犯了一些我找不到的錯誤。
非常感謝您的幫助。
orderInfo必須為null,因為您沒有對其進行初始化,因此無法設置其屬性...因此有2個選項:
checkoutView.orderInfo = [[OrderInfo alloc]init];
checkoutView.orderInfo.shippingName = self.txtFieldNameOnCard.text;
或從以下位置更改您的財產:
@property (strong, nonatomic)Order *orderInfo;
至:
@property (strong, nonatomic)NSString *shippingName ;
根據設置的情節提要,您在“收貨地址視圖控制器”中使用了“文本字段”,它可能會錯過“文本字段”對其控制器的委派。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.