【问题标题】:Accessing properties in viewDidLoad vs viewWillAppear vs viewDidAppear在 viewDidLoad 与 viewWillAppear 与 viewDidAppear 中访问属性
【发布时间】:2013-05-27 21:41:16
【问题描述】:

我有一个正在加载到 UIViewScroll 的详细视图。作为将其加载到滚动视图的一部分,我在详细视图上设置了一些属性,例如按钮 (UIButton) 和行程 (NSString)。

[controller.button setTitle:text forState:UIControlStateNormal];
[controller setTrip:[tripIDs objectForKey:[sortedTrips objectAtIndex:page]]];

现在在细节控制器中,我尝试用三种不同的方法读取这些属性

- (void)viewDidLoad
- (void)viewWillAppear:(BOOL)animated
- (void)viewDidAppear:(BOOL)animated 
{
        NSLog(@"Button text %@",[[[self button] titleLabel]text]);
        NSLog(@"Trip text %@",[self trip] text]);    
}

当我在 viewDidAppear 中读取时,我只获取属性值,对于 viewDidLoad 和 viewWillAppear,我得到的都是 null。

这是为什么呢?还有我应该在哪里读取和写入这些详细视图属性它们出现在屏幕上以便用户在视图加载后看不到文本变化?

感谢您的帮助!

从 details controller.h 添加行程声明

@property (nonatomic, strong) NSString *trip;

【问题讨论】:

  • 您是否正确连接了插座?
  • 是的,IBOutlets 连接到正确的 XIB 控件

标签: ios objective-c uiviewcontroller lifecycle


【解决方案1】:

关于UIButton 问题,问题在于您不能将控制器的视图控件之前 引用到viewDidLoad。因此,如果您创建了控制器,然后尝试立即设置按钮的标题,例如,这将不起作用,因为尚未创建视图。事实上,如果你在调用setTitle 方法时查看controller.button 的值,我怀疑你会看到它是nil。总之,一个视图控制器不应该尝试访问属于另一个视图控制器的视图控件。

您需要做的是在您第一次实例化视图控制器时设置的目标控制器中创建NSString 属性。然后viewDidLoad 应该执行setTitle,将标题设置为您存储在NSString 属性中的值。

关于您的 trip 变量,很难弄清楚那里发生了什么,因为您调用 setTrip 方法(这表明 tripNSString 与您的 NSLog 声明不符trip 属性。忽略在旅行的NSLog 中有不匹配的] 的事实,您还使用了text 方法,如果trip 是@987654340,您会这样做@,例如。但是 NSString 对象没有 text 方法。您可能需要分享您对 trip 属性的声明,以便我们为您提供更多帮助。但如果它是 @987654344 @也是,那么问题很可能和我之前讨论的button一样。

回到关于viewDidLoad v viewWillAppearviewDidAppear 的问题,真的没关系。您的属性应该可以在所有三个中访问。作为实践问题,人们通常使用viewDidLoad,除非有其他需要(例如,计时器或某些动画通常最好在viewDidAppear 中完成),但您在问题中没有明确说明viewDidLoad在这种情况下就不好了。

但正如我所说,我怀疑问题在于您创建 controller 的代码还试图访问它的一些 IBOutlet 对象,这是您无法做到的。或者,您的插座可能没有正确连接。

【讨论】:

  • 感谢您的提示。更改了代码以将 NSString 从父控制器传递给细节控制器。向细节控制器添加了“@property (nonatomic, strong) NSString *buttonLabel”。然后调用 '[controller setButtonLabel:destinationToText]' 在父控制器中进行设置。接下来在细节控制器的 viewDidLoad '[[self button] setTitle:buttonLabel forState:UIControlStateNormal]'。当我检查 viewDidLoad 中的 buttonLabel 仍然为零时。但是当我执行“[[self button] setTitle:buttonLabel forState:UIControlStateNormal]”时,UI 会填充 buttonLabel。魔法?
  • Trip 被声明为@property (nonatomic, strong) NSString *trip;
  • @FireFly 关于你对buttonLabelnil 的评论,如果你已经定义了@property 以及明确声明了一个类实例变量,我不知道。您应该为您的属性声明实例变量,而是让编译器为您综合这些变量。并且要么使用 @synthesize buttonLabel = _buttonLabel; 要么完全省略 @synthesize 语句(在这种情况下,它会做同样的事情,自动合成带有前导下划线的 ivar)。
  • @FireFly 关于您关于 trip 被定义为 NSString 的评论,NSLog 声明 NSLog(@"Trip text %@",[self trip] text]); 没有意义。缺少[,而且NSString 没有text 方法/属性,所以我认为该行至少会生成编译器警告,并且肯定会生成运行时异常。 NSLog 语句是您记录UILabel 文本的方式,但您告诉我们tripNSString,而不是UILabel,所以我不确定如何协调您声称 tripNSString 以及您的 NSLog 声明。
猜你喜欢
  • 2012-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多