我正在尝试将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。谁能指出我做错了什么?
答案 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)
您是否尝试在viewDidAppear
或viewWillAppear
而不是viewDidLoad
中使用字符串属性?会更好......
您可能正在创建视图,并在创建视图控制器或将其添加到堆栈时调用其viewDidLoad
方法/消息。
答案 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
上的字符串,该字符串在加载时尚未初始化但出现时(在接口加载后调用)。
我将此作为我的个人经验和研究发布。