iOS 在视图之间传递数据
Posted
技术标签:
【中文标题】iOS 在视图之间传递数据【英文标题】:iOS Passing data between views 【发布时间】:2014-07-11 18:42:18 【问题描述】:我需要在视图之间传递数据。我真的不知道为什么不工作。 SecondViewController 中的变量 selectedRow 始终为空。
FirstViewController.m
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
[self.tableView deselectRowAtIndexPath:indexPath animated:YES];
SecondViewController *newView = [[SecondViewController alloc] init];
newView.selectedRow = [tablelist objectAtIndex:indexPath.row];
newView.title = [self.tableView cellForRowAtIndexPath:indexPath].textLabel.text;
[self.navigationController pushViewController:newView animated:YES];
SecondViewController.h
@interface SecondViewController : UIViewController
NSString *title,*selectedRow;
@property(nonatomic,retain) NSString *title;
@property (nonatomic,retain) NSString *selectedRow;
@end
SecondViewController.m
@synthesize title,selectedRow;
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self)
textView = [[UITextView alloc]initWithFrame:CGRectMake(0, 64, 320, 370)];
textView.text = selectedRow;
textView.editable = FALSE;
[self.view addSubview:textView.text];
return self;
我挣扎了好几个小时。我真的想不通为什么。 有什么帮助吗? 谢谢
【问题讨论】:
确实我遵循了这样的例子。但仍然无法正常工作。我真的不明白为什么。 已解决。谢谢你。在 viewDidLoad 方法中移动。 【参考方案1】:问题是您在设置属性之前正在查看selectedRow
值。在对init
的调用完成之前,您无法设置selectedRow
属性。
由于您使用该属性是为了设置视图控制器的视图,您应该将该代码移至它所属的viewDidLoad
。通常,您不应在视图控制器的init
方法中访问self.view
。
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self)
return self;
- (void)viewDidLoad
[super viewDidLoad];
textView = [[UITextView alloc]initWithFrame:CGRectMake(0, 64, 320, 370)];
textView.text = selectedRow;
textView.editable = FALSE;
[self.view addSubview:textView.text];
【讨论】:
【参考方案2】:我使用保存字符串将数据传递给下一个视图控制器。您唯一需要做的就是从数据进入视图控制器的位置导入视图控制器。
您可以在第一个视图控制器中使用它
//1e savestring
NSString *saveString1 = emailfield.text;
NSUserDefaults *defaults1 = [NSUserDefaults standardUserDefaults];
[defaults1 setObject:saveString1 forKey:@"saveString1"];
[defaults1 synchronize];
这个在你需要加载数据的视图控制器中
//First load string
NSUserDefaults *defaults1 = [NSUserDefaults standardUserDefaults];
NSString *loadString1 = [defaults1 objectForKey:@"saveString1"];
[emailfield setText:loadString1];
【讨论】:
为什么要打扰这个?为什么不简单地将数据直接传递给视图控制器?【参考方案3】:如果你使用 storyboard 来获取 viewcontroller,你可以试试这个。
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
UIStoryboard *storyboard = [ UIStoryboard storyboardWithName:@"Main" bundle:nil ];
SecondViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"test" ];
vc.title = @"something";
[self.navigationController pushViewController:detailView animated:YES];
【讨论】:
以上是关于iOS 在视图之间传递数据的主要内容,如果未能解决你的问题,请参考以下文章
在视图控制器之间传递数据 - iOS Xcode - 啥是好方法?
如何在视图控制器之间传递数据而不在 ios 中使用 segue?
在视图控制器之间传递 iOS 10 Segue 中的数据 [重复]