2

我正在尝试将 NSString 从一个视图控制器传递到另一个视图控制器。虽然这是一件很容易做的事情,但我不知道我做错了什么,导致接收到的数据为空。这是简化的代码:

DetailViewController.h:

@property (nonatomic, strong) NSString *cUrlString;

细节视图控制器.m

@synthesize cUrlString;

- (void)viewDidLoad
{
    [super viewDidLoad];

    NSLog(@"URL COMMENT STRING %@", cUrlString);
}

第一视图控制器.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 方法中的日志显示为空。谁能指出我做错了什么?

4

6 回答 6

1

viewDidLoadUIViewController在需要时为实例调用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实例时使用这个初始化,

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

希望有帮助!

于 2013-10-31T06:47:37.593 回答
1

您不能尝试在 inviewDidAppearviewWillAppear代替 in中使用您的字符串属性viewDidLoad吗?会更好...

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

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

于 2013-10-31T06:56:19.670 回答
0

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

  tableView.delegate = self;
  tableView.dataSource = self;
于 2013-10-31T07:01:25.340 回答
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;
}
于 2013-10-31T08:03:18.943 回答
0

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

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

于 2014-07-19T09:36:10.447 回答
0
        DetailViewController *cvc = [[DetailViewController alloc] init];
        cvc.cUrlString = entry.link;

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

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

现在您将拥有带有 CUrlString 的 viewController ...

于 2013-10-31T05:59:08.593 回答