1

我有一个正在加载到 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,我得到的只是空值。

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

感谢你的帮助!

从 details controller.h 添加行程声明

@property (nonatomic, strong) NSString *trip;
4

1 回答 1

0

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

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

关于您的trip变量,很难弄清楚那里发生了什么,因为您调用setTrip方法(这表明这与您trip的财产声明不符。忽略您在行程中不匹配的事实,您例如,还使用一种方法,如果是 a ,您会这样做。但是对象没有方法..您可能需要共享您的属性声明,以便我们为您提供更多帮助。但是如果它也是一个,那么问题很可能与我之前讨论的相同。NSStringNSLogtrip]NSLogtexttripUILabelNSStringtexttripIBOutletbutton

回到关于viewDidLoadvviewWillAppear和的问题viewDidAppear,这真的没关系。您的属性应该可以在所有三个中访问。作为实践问题,人们通常使用viewDidLoad除非有其他需要(例如,计时器或某些动画通常最好在 中完成viewDidAppear),但是您没有在问题中阐明任何暗示viewDidLoad在这种情况下不会很好的东西。

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

于 2013-06-01T04:45:53.633 回答