将数据从FirstViewController传递到LastViewController

时间:2015-10-06 21:18:33

标签: ios objective-c uiviewcontroller segue

我目前的设计中有四个viewControllers,我正在设计一个销售产品的应用程序。

FirstViewController获取产品图片,当用户点击下一个按钮时,用户会将用户带到用户描述产品的secondviewcontroller,然后用户点击下一个按钮,将用户带到{{1输入价格和条件的地方。在thirdViewcontroller中有一个发布按钮,用于将产品信息发送到服务器。我正在使用lastviewcontolller方法。

以下segue方法不符合我的要求,因为它将POST对象(产品图片)发送到firstviewcontroller,然后secondviewcontoller也应转发产品图片到secondviewcontroller等等。我不认为这是一种可行的方法。

我想知道从第一页到最后一页收集信息的最佳方式是什么,然后发送。处理该问题的最佳方法是什么?我在viewcontrollers之间使用segue。

thirdviewcontoller

3 个答案:

答案 0 :(得分:1)

创建一个对象作为应用程序的数据模型。它可以是单例,也可以是可从已知位置获得的普通对象,例如应用代理所拥有的。

当您有新信息时更新您的模型,并在需要显示某些内容时从模型中读取。使用prepareForSegue:和链接控制器对于简单的事情可能是可以接受的,但它实际上并不能很好地扩展。

答案 1 :(得分:1)

执行此操作的一种方法是在第一个视图控制器中创建可变字典(或带变量的自定义对象)。然后,您将从第一个视图控制器传递弱引用到可变字典/对象的第二/第三/第四视图控制器。每个视图控制器都能够将数据设置为字典/对象,最后一个将能够处理信息。

另一种方法是使用要存储的变量创建一个简单的单例类。第一个视图控制器将重置单例变量。然后让每个视图控制器访问单例并在那里存储它们的值,最后一个视图控制器将处理来自单例的值。

这取决于您收集的数据量以及您个人喜欢的数据。

答案 2 :(得分:1)

不要使用单身人士,即使这里的大多数用户都告诉你。由于多种原因,它会违反SOLID-Principles

而只是将对象从ViewController传递给ViewController。

如果所有ViewController都需要相同的模型类,则可以创建一个具有模型属性的公共基类。

它可以有这个方法

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

我创建了一个示例项目:https://github.com/vikingosegundo/ProductWizard

注意,所有视图控制器都派生自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

此ViewController知道如何将类Product的模型数据传递给ProductAwareBaseViewController的其他实例及其子类。

所有其他视图控制器都不会处理传递数据,只需将每个数据部分(名称,描述,价格)添加到模型中并显示它。

即:

#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