2013-12-16 73 views
0

我有两个VC,我想将HomeViewController的resourceName传递给SingleWebViewController。但是,resourceName变为空。无法将NSString从一个VC传递到下一个VC

HomeViewController.m

#import "HomeViewController.h" 
#import "SingleWebViewController.h" 

-(void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    singleWebViewController = segue.destinationViewController; 
} 

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    selectedRow = indexPath.row; 

    switch (selectedRow) 
    { 

     case 0: 
     { 
      [email protected]"intro"; 
      NSLog(@"HtmlFileName:%@" , singleWebViewController.resourceName); 
      [self performSegueWithIdentifier:@"toSingleWebView" sender:self]; 
      break; 
     } 
     [tableView deselectRowAtIndexPath:indexPath animated:YES]; 
    } 

SingleWebViewController.h具有以下行

@property (nonatomic,strong)NSString *resourceName; 
- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view. 

     NSString *htmlFile = [[NSBundle mainBundle] pathForResource:self.resourceName ofType:@"html" inDirectory:nil] ; 
     NSLog(@"%@se:" , self.resourceName); 

     NSURL *url = [NSURL fileURLWithPath:htmlFile ]; 
     NSURLRequest *request = [NSURLRequest requestWithURL:url]; 
     [_webView loadRequest:request]; 
     _webView.delegate=(id)self; 

} 

我也注意到,didSelectRowAtIndexPath方法是越来越prepareForSegue之前调用。这是什么原因。请建议。

+1

你在哪里'的alloc init'你'singleWebViewController'在HomeViewController? – Popeye

+2

您需要在'prepareForSegue'中设置'resouceName'属性。 – hgwhittle

回答

0

尝试this..pass值prepareforsegue

编辑:如果你想为不同的情况下,通过不同的值,然后做this..i中号假设你想segueway以相同的ViewController即SingleWebViewController这里。

-(void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
     { 
      if ([segue.identifier isEqualToString:@"toSingleWebView"]) { 
      SingleWebViewController *singleWebViewController = segue.destinationViewController; 
      NSIndexPath *indexPath = [self.tableView indexPathOfSelectedRow]; 
      if(indexpath.row == 0){ 
      [email protected]"intro"; 
      } 
      else if(indexPath.row == 1){ 
       [email protected]"some other value"; 
      } 
      else{ 
       [email protected]"something else"; 
      } 
      NSLog(@"HtmlFileName:%@" , singleWebViewController.resourceName); 
      } 
     } 

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
    { 
     selectedRow = indexPath.row; 

     switch (selectedRow) 
     { 

      case 0: 
      { 

       [self performSegueWithIdentifier:@"toSingleWebView" sender:self]; 
       break; 
      } 
      case 1: 
      { 
       [self performSegueWithIdentifier:@"toSingleWebView" sender:self]; 
       break; 
      } 
      [tableView deselectRowAtIndexPath:indexPath animated:YES]; 
    } 
+0

只是为了增加更多..我将不得不添加更多的switch..cases..upto..0-4 ..在这种情况下,它不可能通过prepareforsegue资源名称.. –

+0

这是可能的即使你使用多种情况..如果你想在情况1中设置值不同,那么...在prepareforsegue中获取所选行的索引路径并发送不同的值。 – suhit

+0

这个案例其实是indexPath.row..will在prepareforsegue中可以访问..? –

2

prepareForSegue中,您正在为singleWebViewController指定一些新内容。如果这个控制器与已经在tableView: didSelectRowAtIndexPath:中分配的控制器不同,我认为它是,那么你的财产将被重置。

相反,这样做:

-(void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { 
    singleWebViewController = segue.destinationViewController; 
    singleWebViewController.resourceName = @"intro"; 
} 
+0

看看上面的编辑..上面的解决方案将不适用,如果switch.case。增加.. –

+0

@Lalit_vicky正确,你需要保存你想要的资源在一个实例变量。 –

1

在你prepareForSegue可以viewDidLoad后设置你设置resourceName财产resourceName

-(void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    SingleWebViewController *singleWebViewController = segue.destinationViewController; 
    [singleWebViewController setResourceName:@"Resource name"]; 
} 
+0

这个局部变量将隐藏实例变量。 –

+0

不清楚“'resourceName'是否隐藏,因为问题说___ SingleWebViewController.h有以下行____ – amb

+0

请看看上面的编辑..这行代码是从我的代码中复制的.. –

0

被调用。添加一个自定义的初始化程序initWithResourceName:(NSString *)resourceName,并将其设置在那里。或者将代码从viewDidLoad移至viewDidAppear:

0

与尝试:

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    HomeViewController *obj = segue.destinationViewController; 
    if([segue.identifier isEqualToString:@"toSingleWebView"]){ 
     obj.singleWebViewController = singleWebViewController; 
    } 
}