iOS在视图之间传递数据

时间:2014-07-11 18:42:18

标签: ios objective-c uitableview view controller

我需要在视图之间传递数据。我真的无法弄清楚为什么不工作。 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; }

我挣扎了好几个小时。我真的不知道为什么。 有帮助吗? 谢谢

3 个答案:

答案 0 :(得分:1)

问题是您在设置属性之前查看selectedRow值。在调用selectedRow之后,您才能设置init属性。

由于您使用该属性是为了设置视图控制器的视图,因此您应该将该代码移动到它所属的viewDidLoad。通常,您不应在视图控制器的self.view方法中访问init

- (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];
}

答案 1 :(得分:0)

我使用了savetrings将数据传递给下一个viewcontroller。您唯一需要做的就是从viewcontroller中的数据导入视图控制器。

您可以在第一个viewcontroller中使用它

//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];

答案 2 :(得分:0)

如果你使用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];
}