如何将信息从一个视图控制器传递到另一个?

时间:2014-08-28 03:14:14

标签: ios objective-c cocoa-touch uiviewcontroller

这是Q& A Style Post

如果我想将参数(例如NSStringNSArrayNSDictionary)从一个视图控制器传递到另一个视图控制器,那么最简单的方法是什么?

1 个答案:

答案 0 :(得分:0)

有多种方法可以实现这一点,但有两种最干净的方法是将参数传递给下一个视图控制器的自定义init方法,或者将参数设置为下一个视图的属性控制器。

请注意,这不仅限于在视图控制器之间传递数据 - 视图控制器是对象,任何对象都可以使用以下原则,我只是使用视图控制器来执行以下示例。

这两个示例都使用简单的UITableViewController作为初始视图控制器,下一个视图控制器将从单元格列表中传递用户的选择,在这些单元格中,他们可以选择自己喜欢的颜色,以及他们的当前日期。选择。这可以通过 FROM 任何类型的视图控制器来实现 TO 任何类型的视图控制器,只需稍作修改,并且在合理范围内对信息的类型/数量没有限制可以通过这种方式传递。

请记住,您可能不希望使用具有10个参数名称的大量初始化方法,因此在这种情况下,您可能希望拥有单独的属性并相应地设置每个属性。如果只有几个参数,您也可能希望将初始化/设置代码保持为单行,因此在这种情况下使用自定义初始化方法可能适合您。

演示表视图设置

#import "TestTableViewController.h"
#import "NextViewController.h"

@interface TestTableViewController ()

@end

@implementation TestTableViewController


- (void)viewDidLoad {
    [super viewDidLoad];

    self.colors = @[@"Red", @"Orange", @"Yellow", @"Green"];
}


#pragma mark - Table view data source

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return self.colors.count;
}


- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"ColorCell"];

    if (!cell) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"ColorCell"];
    }
    cell.textLabel.text = self.colors[indexPath.row];

    return cell;
}

方法#1 - 自定义初始化程序

NextViewController.h

#import <UIKit/UIKit.h>

@interface NextViewController : UIViewController

// expose the custom initializer so other view controller's can pass in the parameters we want to pass
- (instancetype)initWithFavoriteColor:(NSString *)favoriteColor currentDate:(NSDate *)date;

@end

NextViewController.m

#import "NextViewController.h"

@implementation NextViewController

// implement the custom initializer method
- (instancetype)initWithFavoriteColor:(NSString *)favoriteColor currentDate:(NSDate *)date {
    self = [super init];

    // do whatever you want here with the favorite color string and current date that 
    // was passed in, such as save them to instance variables...

    return self;
}

@end

在我们的演示表视图中实现方法#1:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    // get the color they selected for this row from our data source array
    NSString *selectedColor = self.colors[indexPath.row];

    // initialize the next view controller using the handy init method we created
    NextViewController *nextVC = [[NextViewController alloc] initWithFavoriteColor:selectedColor currentDate:[NSDate date]];
    [self.navigationController pushViewController:nextVC animated:YES];
}

方法#2 - 创建/设置属性

NextViewController.h

#import <UIKit/UIKit.h>

@interface NextViewController : UIViewController

@property (nonatomic, retain) NSString *favoriteColor;
@property (nonatomic, retain) NSDate *currentDate;

@end

NextViewController.m

#import "NextViewController.h"

@implementation NextViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    // do something here with your properties - by the time the view has loaded
    // they will have been set/passed from the original view controller
    self.favoriteColor...
    self.currentDate...
}

@end

在我们的演示表视图中实现方法#2:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    // get the color they selected for this row from our data source array
    NSString *selectedColor = self.colors[indexPath.row];

    // initialize the next view controller normally, and set its favorite color property
    // to be what the user selected
    NextViewController *nextVC = [NextViewController new];
    nextVC.favoriteColor = selectedColor;
    nextVC.currentDate = [NSDate date];
    [self.navigationController pushViewController:nextVC animated:YES];
}

在这两种情况下,您现在可以快速轻松地将多条信息从一个视图控制器传递到另一个视图控制器。