2013-10-31 67 views
2

我想从一个视图控制器传递NSString到另一个。虽然它是一件很容易做的事情,但我不知道我在做什么错误,导致收到的数据为空。下面是简化的代码:在ViewControllers之间传递NSString返回NULL

DetailViewController.h:

@property (nonatomic, strong) NSString *cUrlString; 

DetailViewController.m

@synthesize cUrlString; 

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 

    NSLog(@"URL COMMENT STRING %@", cUrlString); 
} 

FirstViewController.m

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { 

     WebViewController *wvc = [self.storyboard instantiateViewControllerWithIdentifier:@"WebViewControllerNew"]; 
     TheItem *entry = [[channel items] objectAtIndex:[indexPath row]]; 
     wvc.title = entry.title; 
     wvc.urlString = entry.link; 
     [self.navigationController pushViewController:wvc animated:YES]; 

     DetailViewController *cvc = [[DetailViewController alloc] init]; 
     cvc.cUrlString = entry.link; 
     //WHEN I USE NSLOG Below, it gives me the correct URL HERE 
     NSLog(@"ENTRY LINK %@", cvc.cUrlString); 

    } 

我给出了一个简化版本的代码。另请参阅FirstViewController.m中的NSLog语句显示其中的正确数据,但DetailViewController.m的viewDidLoad方法中的日志显示为null。任何人都可以指出我做错了什么?

+0

对我来说很好看,让我们来简化一下吧? –

+0

哪里从第一视图控制器推动详细视图控制器?显示代码 – manujmv

+0

你在调用self.navigationController pushViewController:cvc animated:YES];在tableview的didSelectRowAtIndexPath中。并尝试编写cvc.cUrlString = [NSString stringWithFormat:@“%@”,entry.link]; –

回答

0
 DetailViewController *cvc = [[DetailViewController alloc] init]; 
     cvc.cUrlString = entry.link; 

要创建的DetailViewController的新对象上面的代码.. 要么你必须提交或推这对导航控制器来显示相同​​的

[self.navigationController pushViewController:cvc animated:YES]; 

现在你有你自己的viewController与CUrlString ...

+0

请参阅问题 – AJ112

+0

@ AJ112中的更新代码和说明,您的意思是您要更改已存在于导航控制器堆栈中的视图控制器的值? – Raon

+0

意味着wvc是另一个类的实例,我正在推送一些其他数据。 cvc是另一个类的实例,我也想要推送字符串。 – AJ112

1

viewDidLoad被称为UIViewController实例当需要view时。当你以模态方式将其推入导航堆栈或当前控制器时会发生这种情况。我不确定为什么viewDidLoad方法在被推送或呈现时被调用cvc实例。

如果分配属性不适用于您,可以尝试一种解决方法。在DetailViewController.hDetailViewController像下面创建一个自定义init方法,

- (id) initWithURLString:(NSString*) urlString { 
    self = [super init]; 
    if(self) { 
     self.cUrlString = urlString; 
    } 
    return self; 
} 

声明这个方法,

- (id) initWithURLString:(NSString*) urlString; 

然后在创建cvc情况下使用这个初始化,

DetailViewController *cvc = [[DetailViewController alloc] initWithURLString:entry.link]; 

。希望帮助!

+0

我试过这段代码,现在在initWithUrlString里面,如果我登录self.cUrlString,它会显示我想要的正确url,但是如果我在viewDidLoad中记录self.cUrlString,那么它仍然显示为null。为什么这样? – AJ112

+0

@ AJ112你是否在代码的其他地方重置'cUrlString'?因为没有理由不成为'否'。 – Amar

+0

我已重新检查它,它没有得到重置任何地方或没有分配到零任何地方。还有什么可能是这个问题? – AJ112

0

我想你没有设置表视图代表在你创建表视图

tableView.delegate = self; 
    tableView.dataSource = self; 
0

在你DetailViewController.minitWithNibName方法ALLOC您字符串如下所示

​​
+0

试过你的代码,它不起作用。 – AJ112

+0

我认为你的代码存在一些错误,我告诉你另一种方式你去这种方式确定一个常量类,以至于需要一个NSString * cUrlString; #import 您是否需要该字符串以便首先在FirstViewController中导入并简单地将该代码放在您的didSelectRowAtIndexPath cUrlString = entry.link;然后在你的详细视图控制器导入常量类,并使用cUrlString你想使用的地方试试看,我相信它适合你 –

0

NSLog您在viewDidAppear上传递的字符串不在viewDidLoad上,字符串在加载时尚未初始化,但它出现(在接口加载后调用该字符串)。

我发布这个作为我的个人经验和研究。

相关问题