如何将值传递给另一个视图控制器?
Posted
技术标签:
【中文标题】如何将值传递给另一个视图控制器?【英文标题】:How to pass a value to anotherviewcontroller? 【发布时间】:2011-12-12 13:31:07 【问题描述】:大家好,我在UIViewController
中有一个UITableView
。当点击表格中的一行时,我正在收集单元格的文本值并将其放入一个名为 localstringGValue
的字符串中。
我想传递这个字符串并将其显示在另一个viewController
中,但不使用-pushViewController
:我希望将此值存储在NSUserDefaults
或NSDictonary
之类的地方,然后在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”实例之前,您需要将其设置为 delegate
为 self
(在 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 - 如何将集合视图单元格的索引行传递给另一个视图控制器