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 在视图之间传递数据的主要内容,如果未能解决你的问题,请参考以下文章

在 xamarin.ios 中的视图控制器之间传递数据

在视图控制器之间传递数据 - iOS Xcode - 啥是好方法?

如何在视图控制器之间传递数据而不在 ios 中使用 segue?

在视图控制器之间传递 iOS 10 Segue 中的数据 [重复]

在视图控制器之间的 NSString 中传递数据 - 目标 C [重复]

Swift - 在视图控制器之间传递数据