didSelectRowAtIndexPath,pushViewController和一个小标签

时间:2013-08-29 21:00:39

标签: objective-c uiviewcontroller uilabel uitableview

我有一个表控制器,我在其中使用 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。它怎么样?

2 个答案:

答案 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是否为标签已正确链接。