【问题标题】:UILabel never gets initialized in viewDidLoadUILabel 永远不会在 viewDidLoad 中初始化
【发布时间】:2015-09-16 02:11:12
【问题描述】:

我在界面生成器中有一个 UILabel,我已连接到一个属性,但它通过该视图控制器上的 viewDidLoad 保持为零。我一直在逐步完成,一旦 DetailViewController 被初始化,label 属性就在那里,但它是 nil 并且它似乎从未被初始化。

在我从使用 segues 切换到在导航控制器上执行 pushViewController 之前,它一直有效。

// DetailsViewController.h

#import <UIKit/UIKit.h>
#import "TLitem.h"

@interface DetailsViewController : UIViewController

@property (nonatomic, strong) TLitem *entry;
@property (weak, nonatomic) IBOutlet UILabel *entryLabel;

@end

然后在另一个视图控制器的表视图中:

// EntryListViewController.m

DetailsViewController *details = [[DetailsViewController alloc] init];
[details setEntry:entry];
[self.navigationController pushViewController:details animated:YES];

在viewDidLoad中:

// DetailsViewController.m
- (void)viewDidLoad {
    [super viewDidLoad];
    [self.view setBackgroundColor:[UIColor yellowColor]];
    TLitem *entry = [self entry];
    UILabel *label = [self entryLabel];

    label.text = [entry valueForKey:@"text"];

【问题讨论】:

  • 您提到您从 segues 更改为以编程方式推送您的视图控制器。向我们展示您实例化它的代码。
  • 如果您的视图控制器的视图和相关标签在情节提要中定义,您应该从UIStoryboard 实例中对其进行实例化。
  • 实例化视图控制器?这是上面 NewEntryListViewController.m 中的第一行。
  • 抱歉,错过了。但正如我所想,Jeffrey Thomas 下面的答案应该可以解决您的问题。

标签: ios objective-c uilabel


【解决方案1】:

[[DetailsViewController alloc] init] 没有从情节提要加载视图控制器。它会创建一个新的DetailsViewController,但不会连接来自 IB 的任何内容。查看-instantiateViewControllerWithIdentifier:

它看起来像

DetailsViewController *details = [self.storyboard instantiateViewControllerWithIdentifier:@"Some Storyboard Identifier You Create"];
details.entry = entry;
[self.navigationController pushViewController:details animated:YES];

【讨论】:

  • 这个。所有与插座连接等有关的信息都在情节提要中。基于故事板的视图控制器使用-initWithCoder: 进行实例化。
  • 谢谢! self.storyboard 为 nil,并表示它是只读属性。有没有地方可以为整个应用程序设置故事板? (编辑 - 过早按下 Enter)。
  • @thisAnneM 否。每个视图控制器都必须使用其创建者的故事板(或+storyboardWithName:)创建。你是如何实例化NewEntryListViewController的?
  • @JefferyThomas(我更新了文件名 - 它实际上是 EntryListViewController)。 EntryListTableViewController *entryList = [[EntryListTableViewController alloc] init]; 该文件没有 IBOutlets,这就是我侥幸逃脱的原因。它又由初始视图控制器创建。那么我是否应该在初始视图控制器中引用 Main Storyboard 文件,然后在每次实例化新视图控制器时使用 +storyboardWithName
  • @JefferyThomas - 我将其更改为EntryListTableViewController *entryList = [self.storyboard instantiateViewControllerWithIdentifier:@"EntryList"],因此每个连续的视图都使用情节提要进行实例化,从而解决了所有问题。非常感谢:)
猜你喜欢
  • 1970-01-01
  • 2012-03-10
  • 1970-01-01
  • 2010-12-26
  • 2019-01-08
  • 2011-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多