Passing data from the FirstViewController to the LastViewController

后端 未结 3 914
再見小時候
再見小時候 2020-12-22 01:13

I have four viewControllers in my current design and I am designing an app to sell a product.

FirstViewController gets the product image and when user

3条回答
  •  粉色の甜心
    2020-12-22 01:26

    Please don't use a singleton, even if the majority of users here tells you so. It would violate the SOLID-Principles for several reasons.

    Instead just pass the object from ViewController to ViewController.

    If all ViewController expect the same model class, you can create a common base class that has the property for the model.

    it could have this method

    - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
    {
        if ([segue.destinationViewControler isKindOfClass:[ProductAwareBaseViewController class]])
        {
            ProductAwareBaseViewController *vc = (ProductAwareBaseViewController *)segue.destinationViewControler;
            vc.product = self.product;
        }
    }
    

    I created an example project: https://github.com/vikingosegundo/ProductWizard

    Note, that all view controller derive from ProductAwareBaseViewController

    @import UIKit;
    
    @class Product;
    
    @interface ProductAwareBaseViewController : UIViewController
    @property (nonatomic, strong) Product *product;
    @end
    

    #import "ProductAwareBaseViewController.h"
    #import "Product.h"
    
    @interface ProductAwareBaseViewController ()
    
    @end
    
    @implementation ProductAwareBaseViewController
    
    - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
    {
        if ([segue.destinationViewController isKindOfClass:[ProductAwareBaseViewController class]]) {
            ProductAwareBaseViewController *vc = (ProductAwareBaseViewController *)segue.destinationViewController;
            vc.product = self.product;
        }
    }
    @end
    

    This ViewController knows how to pass the model data of class Product to other instances of ProductAwareBaseViewController and subclasses of it.

    All other view controller don't deal with passing the data, just adding each portion of data (name, description, price) to the model and displaying it.

    i.e:

    #import "EditNameProductViewController.h"
    #import "Product.h"
    
    @interface EditNameProductViewController () 
    @property (weak, nonatomic) IBOutlet UITextField *nameField;
    @end
    
    @implementation EditNameProductViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        self.product = [[Product alloc] init]; 
    }
    
    - (IBAction)continueTapped:(id)sender {
        self.product.productName = self.nameField.text; 
    }
    
    @end
    

    #import "EditDescriptionProductViewController.h"
    #import "Product.h"
    
    @interface EditDescriptionProductViewController ()
    @property (weak, nonatomic) IBOutlet UITextField *descriptionField;
    @property (weak, nonatomic) IBOutlet UILabel *nameLabel;
    @end
    
    @implementation EditDescriptionProductViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        self.nameLabel.text = self.product.productName;
    }
    
    - (IBAction)continueTapped:(id)sender {
        self.product.productDescription = self.descriptionField.text;
    }
    
    @end
    

提交回复
热议问题