我有一个表控制器,我在其中使用 didSelectRowAtIndexPath 从推送的单元格导航到另一个视图。在其中我初始化新的视图控制器并在其中推送一些数据。之后我做 pushViewController 。
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
// Navigation logic may go here. Create and push another view controller.
ServicesModel *service = [services objectAtIndex:indexPath.row];
ServiceViewController *serviceViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"ServiceView"];
serviceViewController.serviceModel = service;
NSLog(@"Set model %@", service.title);
// Pass the selected object to the new view controller.
[self.serviceController pushViewController:serviceViewController animated:YES];
}
在我的 ServiceViewController 中,我为所选服务提供了标签 serviceTitle 和 ServiceModel 属性
@property (weak, nonatomic) IBOutlet UILabel *serviceTitle;
@property (strong, nonatomic) ServiceModel *serviceModel;
使用 viewDidLoad 我正在尝试更改标签的文字
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view.
NSLog(@"viewDidLoad %@", self.serviceModel.title);
self.serviceTitle.text = self.serviceModel.title;
}
此外,我正在尝试访问 viewDidAppear
中的模型- (void) viewDidAppear:(BOOL)animated
{
NSLog(@"viewDidAppear %@", self.serviceModel.title);
}
但是当视图打开时,标签为空。为什么?我究竟做错了什么?最奇怪的是日志:
(-[ServiceViewController viewDidLoad]) (ServiceViewController.m:43) viewDidLoad (null)
(-[ServicesTableViewController tableView:didSelectRowAtIndexPath:]) (ServicesTableViewController.m:127) Set model Google.com
(-[ServiceViewController viewDidAppear:]) (ServiceViewController.m:36) viewDidAppear (null)
它显示 viewDidLoad 在分配模型属性之前触发。并且在 viewDidAppear 模型属性中仍为null。它怎么样?
答案 0 :(得分:2)
你有两个问题。第一个,如0x7fffffff所提到的,是你正确地实例化你的控制器(它应该是initWithNibName:bundle:如果是在xib中制作的,就像0x7fffffff所说,如果在故事板中)。
其次,您无法从didSelectRowAtIndexPath访问serviceViewController中的标签,因为它的视图尚未加载。因此,不是在didSelectRowAtIndexPath中设置标签,而是应该在serviceViewController中有一个字符串属性,并为其赋予值service.text。然后在viewDidLoad中,您可以使用该字符串填充标签。
答案 1 :(得分:1)
标签是否完全丢失,或者您是否看到它并且它没有收到更新的文本?如果缺少标签,则可能是您创建视图控制器的方式存在问题。例如,如果您正在使用故事板,则应该像这样访问视图控制器:
ServiceViewController *controller = [self.storyboard instantiateViewControllerWithIdentifier:@"SomeStoryBoardID"];
而不是:
ServiceViewController *serviceViewController = [[ServiceViewController alloc] init];
但是,如果您可以看到标签,但它还没有更新它的文本,那么您应该首先检查Interface Builder中的连接检查器,并验证IBOutlet是否为标签已正确链接。