在ViewControllers之间传递NSString返回NULL

时间:2013-10-31 05:52:54

标签: ios iphone objective-c nsstring

我正在尝试将NSString从一个View Controller传递到另一个。虽然这是一件非常容易的事,但我不知道我做错了什么导致了收到的数据。这是简化的代码:

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。谁能指出我做错了什么?

6 个答案:

答案 0 :(得分:1)

当需要viewDidLoad时,会为UIViewController实例调用

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

如果分配属性不适合您,您可以尝试解决方法。为init创建自定义DetailViewController方法,如下所示

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

DetailViewController.h

中声明此方法
- (id) initWithURLString:(NSString*) urlString;

然后在创建cvc实例时使用此init,

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

希望有所帮助!

答案 1 :(得分:1)

您是否尝试在viewDidAppearviewWillAppear而不是viewDidLoad中使用字符串属性?会更好......

您可能正在创建视图,并在创建视图控制器或将其添加到堆栈时调用其viewDidLoad方法/消息。

您还可以使用故事板: https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIViewController_Class/Reference/Reference.html#//apple_ref/occ/instm/UIViewController/prepareForSegue:sender

答案 2 :(得分:0)

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

以上代码您正在创建DetailViewController的新对象.. 您必须将其显示或推送到导航控制器才能显示相同的

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

现在你将使用CUrlString的viewController ...

答案 3 :(得分:0)

我认为您没有在创建表视图的位置设置表视图委托

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

答案 4 :(得分:0)

DetailViewController.m initWithNibName 方法中,分配字符串,如下所示

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
      cUrlString = [[NSString alloc]init];
    }
    return self;
}

答案 5 :(得分:0)

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

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