对不起基本问题,但现在这让我有点困扰 .
我从UITable创建一个详细信息视图,并尝试动态设置其标签,但他们没有更新:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
myObject *tmpObj = [[myObject objectAtIndex:indexPath.section] objectAtIndex:indexPath.row];
myViewController *tmpVC = [[myViewController alloc] initWithNibName:@"NIBfile" bundle:nil];
[tmpVC.myLabel setText:tmpObj.myTitle]; // The debugger shows the text: myTitle = "myText"
NSLog(@"%@", tmpVC.myLabel); // NSLog SHOWS NULL
[self.navigationController pushViewController:tmpVC animated:YES];
[tmpObj release];
}
Interface Builder中的连接已设置 . 显示文件所有者的“连接”选项卡
'myLabel' - 'Label (myLabel)'
任何想法为什么 Value 没有通过?
还有一些观察:
-
我也连接了IBAction . 单击连接按钮时,可以正确调用此方法 .
-
我得到了一些指向我的NSLog语句的指针,无论是否应该更好地使用tmpVC.myLabel.text,但尝试也返回NULL .
-
myLabel在界面中声明为IBOutlet UILabel * myLabel . 该属性定义为非原子,保留 .
有光:
在玩了一下之后,我将pushViewController语句移到了标签更新之上 . 这解决了标签更新问题 .
工作代码如下所示:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
myObject *tmpObj = [[myObject objectAtIndex:indexPath.section] objectAtIndex:indexPath.row];
myViewController *tmpVC = [[myViewController alloc] initWithNibName:@"NIBfile" bundle:nil];
[self.navigationController pushViewController:tmpVC animated:YES];
[tmpVC.myLabel setText:tmpObj.myTitle]; // The debugger shows the text: myTitle = "myText"
NSLog(@"%@", tmpVC.myLabel); // NSLog SHOWS NULL
[tmpObj release];
}
但我不明白为什么我需要先推动我的viewController ???
5 回答
不确定,但我认为这是正在发生的事情:
按下视图时,控制器从笔尖加载视图并连接操作和出口 . 在此之前,插座没有连接,所以tmpVC.myLabel是零 .
如果你想确定,你可以在tmpVC的
viewDidLoad
中放置一个断点来查看加载视图的时间 .是不是因为你的
NSLog
试图打印出实际的标签对象 . 你不应该吗?在回复添加的信息时:您的其他问题似乎是您已将
NSString
链接到您的标签 . 你必须将它链接到UILabel
. 因此,在声明myLabel
var的地方,将其更改为UILabel *myLabel
,并将其更改为任何匹配的属性 .那是因为只有在访问时才会懒惰地创建控制器的视图 . 按下控制器可访问视图 .
或者,如果您添加一行来访问视图属性,它也会起作用:
如果
tmpVC.myLabel
为NULL,则可能表示您尚未在Interface Builder中从UILabel到myLabel实例变量进行必要的连接 .你在
myViewController.m
中的@synthesize
属性了吗?你应该可以这样做:tmpVC.myLabel.text = tmpObj.myTitle;