IOS Obj-C ViewController没有传递值

时间:2016-09-23 14:10:24

标签: ios objective-c variables segue 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子类。有一个带标识符的segue&#34; s_msgDetail&#34;从原型单元的选择事件到messageDetailVC(show)。正如我上面所说的messageDetailVC出现,只是没有将body.text设置为&#34; messageID&#34;的值。

2 个答案:

答案 0 :(得分:0)

您正在messageID视图控制器的错误实例上设置messageDetail。由于您使用的是故事板,因此故事板已经为您创建并呈现了messageDetail的实例。但是,在tableView:didSelectRowAtIndexPath:中,您正在创建第二个并展示它。 (我很惊讶你这样做时没有得到一堆运行时动画警告。)

您应该在messageID中设置prepareForSegue:sender:,如下所示:

- (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 */;
    }
}

答案 1 :(得分:0)

您必须使用prepareForSegue将值传递给另一个视图控制器