2013-10-31 64 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上,字符串在加載時尚未初始化,但它出現(在接口加載後調用該字符串)。

我發佈這個作爲我的個人經驗和研究。

相關問題