2016-09-23 76 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传递价值到另一个视图控制器

相关问题