我有一个正在加载到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。
为什么?此外,我应该在哪里阅读和编写之前它们出现在屏幕上的详细视图属性,以便用户在视图加载后看不到文本更改?
感谢您的帮助!
从详细信息controller.h添加旅行声明
@property (nonatomic, strong) NSString *trip;
答案 0 :(得分:0)
关于UIButton
问题,问题是您无法将控制器的视图控件之前引用到viewDidLoad
。因此,如果您创建控制器而不是尝试立即设置按钮的标题,例如,由于尚未创建视图,这将无效。实际上,如果您在进行controller.button
方法调用时查看setTitle
的值,我怀疑您会看到它是nil
。最重要的是,一个视图控制器永远不应该尝试访问属于另一个视图控制器的视图控件。
您需要做的是在首次实例化视图控制器时设置的目标控制器中创建NSString
属性。然后viewDidLoad
应该执行setTitle
,将标题设置为您在NSString
属性中存储的值。
关于您的trip
变量,由于您调用setTrip
方法(表明trip
是NSString
),因此很难弄清楚那里发生了什么包含NSLog
trip
属性的]
声明。忽略了NSLog
行程中text
不匹配的事实,您还使用了{{1}例如,如果trip
是UILabel
,您就可以执行此操作。但是NSString
个对象没有text
方法。您可能需要分享您对trip
财产的声明,以便我们为您提供更多帮助。但如果它也是IBOutlet
,则问题可能与我先前关于{{button
的讨论相同1}}。
回到关于viewDidLoad
v viewWillAppear
和viewDidAppear
的问题,这无关紧要。您应该可以访问这三个属性。作为一种惯例,人们通常使用viewDidLoad
除非需要其他东西(例如定时器或某些动画通常最好在viewDidAppear
中完成),但你没有在你的问题中明确提出任何建议在这种情况下,viewDidLoad
不会很好。
但正如我所说,我怀疑问题是你创建controller
的代码也试图访问一些你不能做的IBOutlet
对象。或者,您的网点可能没有正确连接。