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 没有更新的主要内容,如果未能解决你的问题,请参考以下文章

如何每天更新一次 UILabel

更新UILabel文本时出现问题

如何在没有 XIB 文件的情况下以编程方式更新 Xcode 中的 UILabel?

为啥我在 UITableCellView 中的 UIView 中的 UILabel 在正确的数据库调用后没有更新(似乎与单元重用有关)?

Storyboard UILabel 不会更新文本。

调整 UITableViewCell 中的 UILabel 大小在渲染前未更新