如何将值传递给另一个视图控制器?

Posted

技术标签:

【中文标题】如何将值传递给另一个视图控制器?【英文标题】:How to pass a value to anotherviewcontroller? 【发布时间】:2011-12-12 13:31:07 【问题描述】:

大家好,我在UIViewController 中有一个UITableView。当点击表格中的一行时,我正在收集单元格的文本值并将其放入一个名为 localstringGValue 的字符串中。

我想传递这个字符串并将其显示在另一个viewController 中,但不使用-pushViewController:我希望将此值存储在NSUserDefaultsNSDictonary 之类的地方,然后在viewWillapper 上另一个视图控制器我希望这个存储的值显示在标签中。

在我的.h

 NSString *localStringGValue;

在我的.m:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
    [tableView deselectRowAtIndexPath:indexPath animated:YES];

    localStringGValue = [tableView cellForRowAtIndexPath:indexPath].textLabel.text; 

在我的另一个视图控制器中:

-(void)viewWillAppear

    label.text=localStringGValue;

提前致谢。

【问题讨论】:

委托和协议的简单案例...iphonedevelopertips.com/objective-c/… 搜索委托变量... 【参考方案1】:

保存到 nsuserdefaults:

[[NSUserDefaults standardUserDefaults] setObject:localstringGValue forKey:@"localstringGValue"];
[[NSUserDefaults standardUserDefaults] synchronize];

从 nsuserdefaults 中检索:

NString *localstringGValue = [[NSUserDefaults standardUserDefaults] objectForKey:@"localstringGValue"];

【讨论】:

这是使用NSUserDefaults 存储动态值的好方法吗? 在这种情况下,您如何定义“好”?这只是一种使用方式,当你觉得它是明智的时候。有时我会混合使用通知和委托。但是,大多数情况下我使用不同的模型类。对于少量不常见的数据和一个简单的选项 nsuserdefaults 有时就足够了。我们都必须先走路才能跑步。【参考方案2】:

只需使用delegate。在推送“UploadViewController”实例之前,您需要将其设置为 delegateself(在 GoogleDocMainPageController.m 中)。每次选择表格单元格时,它会通过调度self.delegate 的方法为self.delegate(这里是GoogleDocMainPageController 实例)设置值,该方法由GoogleDocMainPageController 实现:

[self.delegate setDataAfterSelectedTabelCell:[NSString stringWithFormat:@"TalbeCell %d selected", [indexPath row]]];

主要代码如下: UploadViewController.h:

#import <UIKit/UIKit.h>

@class UploadViewController;

@protocol UploadViewControllerDelegate <NSObject>

- (void)setDataAfterSelectedTabelCell:(NSString *)stringValueInCell;

@end

@interface UploadViewController : UITableViewController

@property (nonatomic, retain) id <UploadViewControllerDelegate> delegate;

@end

UploadViewController.m:

//...
@synthesize delegate = _delegate;

//...
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath

    [self.delegate setDataAfterSelectedTabelCell:[NSString stringWithFormat:@"TalbeCell %d selected", [indexPath row]]];

GoogleDocMainPageController.h:

#import <UIKit/UIKit.h>

#import "UploadViewController.h"

@class UploadViewController;

@interface GoogleDocMainPageController : UIViewController <UploadViewControllerDelegate>

- (void)loadUploadViewController;

@property (nonatomic, retain) UILabel * glLabel;
@property (nonatomic, retain) UploadViewController * uploadViewController;

@end

GoogleDocMainPageController.m:

//...
@synthesize glLabel = _glLabel;
@synthesize uploadViewController = _uploadViewController;

//...
- (void)viewDidLoad

    [super viewDidLoad];

    UIButton * uploadButton = [[UIButton alloc] initWithFrame:CGRectMake(10.0f, 160.0f, 300.0f, 35.0f)];
    [uploadButton setBackgroundColor:[UIColor blackColor]];
    [uploadButton setTitle:@"Upload Button" forState:UIControlStateNormal];
    [uploadButton addTarget:self action:@selector(loadUploadViewController) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:uploadButton];
    [uploadButton release];

    self.glLabel = [[UILabel alloc] initWithFrame:CGRectMake(10.0f, 200.0f, 300.0f, 35.0f)];
    [self.glLabel setBackgroundColor:[UIColor blackColor]];
    [self.glLabel setTextColor:[UIColor whiteColor]];
    [self.glLabel setTextAlignment:UITextAlignmentCenter];
    [self.glLabel setText:@"Default"];
    [self.view addSubview:self.glLabel];

    self.uploadViewController = [[UploadViewController alloc] initWithStyle:UITableViewStylePlain];


//...
#pragma mark -

- (void)loadUploadViewController

    [self.uploadViewController setDelegate:self];
    [self.navigationController pushViewController:self.uploadViewController animated:YES];


#pragma mark - UploadViewControllerDelegate

- (void)setDataAfterSelectedTabelCell:(NSString *)stringValueInCell

    [self.glLabel setText:stringValueInCell];

【讨论】:

先生,我不明白这段代码:// 然后只显示你的另一个视图控制器 - (void)theMethodDispatchAnotherViewController [self.navigationController pushViewController:self.yourAnotherViewController animated:YES];我把这段代码放在哪里了? 所以在 viewwillappear 的另一个视图控制器我想把 lbel.text = self.yourAnotherviewcontroller 对吗? @ICoder 它只是一个示例方法,你可以把它放在你的.m 文件中。好吧,算了,当你需要显示你的another view时,只需使用你的self.yourAnotherViewController 所以 label.text =self.yourAnotherViewController;在另一个viewcontroller的viewwillapper中 @ICoder,不,是label.text = self.localStringGValue;,localStringGValue 是在YourAnotherViewController.h 中声明的。【参考方案3】:

你为什么不声明一些@property(nonatomic,retain)@synthesize呢?然后将自动创建 getter/setter。否则,请自己定义一些 getter/setter。

【讨论】:

我已经声明了它,但正如我之前所说,我没有将那个值传递给页面重定向代码,我只是希望当我点击 tableview 单元格时该值显示在标签中【参考方案4】:

执行以下步骤-

在第一个 ViewController 中 -

    创建第二个 ViewController 的对象 像 SecondViewController *sec= [[SecondViewController alloc]init]; sec.myLable=@"我的标签字符串";

    在第二个 ViewController 中 -

    在 .h 文件中 UILable *myLable;

    @property(nonautomic,retain)IBOutlet UILable *myLable;

    2.在.m文件中 @synthesize myLable;

【讨论】:

以上是关于如何将值传递给另一个视图控制器?的主要内容,如果未能解决你的问题,请参考以下文章

如何将标签内的标签快速传递给另一个视图控制器[关闭]

Swift 2.1 - 如何将集合视图单元格的索引行传递给另一个视图控制器

如何将控制从一个手势识别器传递给另一个

将 qr 图像传递给另一个视图控制器

如何在ios中自定义推送和弹出动画时将视图传递给另一个控制器? [关闭]

从按钮将值传递给视图控制器字典