UILabel 没有更新
Posted
技术标签:
【中文标题】UILabel 没有更新【英文标题】:UILabel not updating 【发布时间】:2010-04-27 11:20:41 【问题描述】:对不起,这个基本问题,但这让我困扰了一段时间。
我从 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)'
任何想法为什么价值没有通过?
还有一些观察:
我还连接了一个 IBAction。 当我正确调用此方法时 点击已连接的按钮。 我得到了一些指向我的 NSLog-statement,是否应该 最好不要使用 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 ???
【问题讨论】:
除了dealloc之外,你会在代码中的任何地方发布它吗? 【参考方案1】:这是因为控制器的视图只有在访问时才会延迟创建。推动控制器访问视图。
或者,如果您添加一行来访问视图属性,它也可以工作:
myViewController *tmpVC = [[myViewController alloc] initWithNibName:@"NIBfile" bundle:nil];
tmpVC.view; // Force view creation
[tmpVC.myLabel setText:tmpObj.myTitle]; // The debugger shows the text: myTitle = "myText"
NSLog(@"%@", tmpVC.myLabel); // NSLog will display "myText"
[self.navigationController pushViewController:tmpVC animated:YES];
【讨论】:
谢谢@Hwee-Boon-Yar BTW,tmpVC.view 返回了一个警告,[tmpVC view] 100% 为我工作 ;) 我刚刚发现了同样的问题 - 这不是“谢谢”,只是指出我使用的另一个选项是将文本存储在视图控制器对象中,并将其设置为viewDidLoad 感谢您让我学习新事物。Force view Creation.+1 从我身边【参考方案2】:如果tmpVC.myLabel
为NULL,这可能表明您没有在Interface Builder 中建立从UILabel 到您的myLabel 实例变量的必要连接。
【讨论】:
连接存在:文件所有者出口显示“我的标签”-“标签(myLabel)”。【参考方案3】:您在myViewController.m
中有@synthesize
您的myLabel
属性吗?您应该能够执行以下操作:
tmpVC.myLabel.text = tmpObj.myTitle;
【讨论】:
这就是我的情况。忘记了“@synthesize”。谢谢!【参考方案4】:不确定,但我认为这是怎么回事:
当视图被推送时,控制器从 nib 加载视图并连接动作和出口。在此之前,outlet 没有连接,所以 tmpVC.myLabel 为 nil。
如果你想确定,你可以在 tmpVC 的viewDidLoad
中放一个断点来查看视图何时加载。
【讨论】:
【参考方案5】:难道不是因为您的NSLog
试图打印出实际的标签对象。你应该没有
NSLog(@"%@", tmpVC.myLabel.text);
针对添加的信息:您的另一个问题似乎是您已将NSString
链接到您的标签。您必须将其链接到UILabel
。因此,在声明 myLabel
变量的地方,将其更改为 UILabel *myLabel
,任何匹配的属性都相同。
【讨论】:
嗯,我想你就在那儿,但是 (a) 当我尝试添加“.text”时,我收到编译器错误“成员 'myLabel' 不在结构或联合中” (b) 前面的 setText 语句不会在视图中产生任何更新。 也许 (a) 会导致视图未正确连接到 nib 或控制器,但看不到中断的位置... . 在我的回答中添加了更多内容,见上文 嗨 Codezy,抱歉,这是一个错字(已在上面更正)。 IB 不会让我在没有匹配类的情况下连接 2。定义是 UILabel ... 你是不是在 dealloc 之外的任何地方发布该标签,因为那样可以做到。 不是dealloc,但请查看我在上述问题中的更新(在THE THE S THE LIGHT 下)。看来代码序列需要改变以上是关于UILabel 没有更新的主要内容,如果未能解决你的问题,请参考以下文章
如何在没有 XIB 文件的情况下以编程方式更新 Xcode 中的 UILabel?
为啥我在 UITableCellView 中的 UIView 中的 UILabel 在正确的数据库调用后没有更新(似乎与单元重用有关)?