2016-09-23 74 views
0

我知道這個問題已經被問到了,但是我已經閱讀了回覆,通過了修復並且仍然存在一個我無法識別的問題。IOS Obj-C ViewController沒有傳遞值

我有一個類似於電子郵件的IOS應用程序。它有一個InboxVC,它是一個帶有自定義原型單元格的tableVC,它在選擇時觸發messageDetailVC。

問題是,messageDetailVC被觸發,但值沒有被傳遞給它。在添加Storyboard問題之前,我添加了日誌消息來評估代碼中的值,並且傳遞的變量(messageID)具有NULL值。

有人能告訴我我失蹤或做錯了什麼嗎?我的代碼是:

InboxVC.m(片段)

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

    [tableView deselectRowAtIndexPath:indexPath animated:YES]; 
    NSLog(@"%@: Message touched...", LOG_TAG); 
    messageDetail *mdvc = [[messageDetail alloc] init]; 
    mdvc.messageID = @"123456789-1"; 
    [self.navigationController pushViewController:mdvc animated:YES]; 
    NSLog(@"%@: messageID value is = %@",LOG_TAG,mdvc.messageID); 
    //messageID has valid value here 
} 

messageDetail.h

#import <Foundation/Foundation.h> 
#import <UIKit/UIKit.h> 

@interface messageDetail : UIViewController 
{ 
    NSString *messageID; 
} 

@property (strong, nonatomic) NSString *messageID; 
@property (strong, nonatomic) IBOutlet UITextView *body; 

messageDetail.m

#import <Foundation/Foundation.h> 
#import "messageDetail.h" 

static NSString * LOG_TAG = @"messageDetailController"; 

@implementation messageDetail 

@synthesize messageID; 
@synthesize body; 

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    body.text = messageID; 
    //debug messages 
    NSLog(@"%@:Added messageID as Body text", LOG_TAG); 
    NSLog(@"%@:Value of body.text is = %@", LOG_TAG, body.text); 
    NSLog(@"%@:Value of messageID is = %@", LOG_TAG, messageID); 
    //messageID has null value here 
} 

- (void) viewWillAppear:(BOOL)animated { 
    [self.navigationController setNavigationBarHidden:NO]; 

} 

MainStoryboard:

我有一個messageDetail視圖綁定到UIViewController的messageDetail子類。從原型單元格的選擇事件到messageDetailVC(show)有一個標識符爲「s_msgDetail」的segue。正如我上面所說的,messageDetailVC出現了,而不是body.text被設置爲「messageID」的值。

+0

也許viewDidLoad中的代碼正在執行此行之前:mdvc.messageID = @「123456789-1」;做到這一點的正確方法是一個自定義的init方法,它接受你想要傳遞的任何輸入參數。 – Woodstock

回答

0

您正在對您的messageDetail視圖控制器的錯誤實例設置messageID。由於您正在使用故事板,故事板已經爲您創建並呈現了一個messageDetail的實例。但是,在tableView:didSelectRowAtIndexPath:您正在創建第二個並呈現它。 (我很驚訝這樣做,當你沒有得到一堆運行動畫警告。)

你應該在prepareForSegue:sender:這樣被設置messageID

- (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { 
    if ([segue.identifier isEqualToString:@"s_msgDetail"]) { 
     messageDetail * vc = (messageDetail *) segue.destinationViewController; 
     NSIndexPath * indexPath = [self.tableView indexPathForSelectedRow]; 
     vc.messageID = /* use indexPath to get data from messages collection */; 
    } 
} 
+0

感謝您的答案。我沒有收到有人回覆的電子郵件。我讀了很多關於prepareForSegue的內容,因爲它似乎是正確的方法,但我確實嘗試過並且無法使其工作。我會給你的片段嘗試... – Rob

0

你必須使用prepareForSegue傳遞價值到另一個視圖控制器

相關問題