1

我有一个表控制器,我在其中使用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中,我有一个标签serviceTitleServiceModel属性用于选定的服务

@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模型属性中仍然为空。怎么可能?

4

2 回答 2

2

你有两个问题。第一个,正如 0x7fffffff 提到的那样,是你错误地实例化了你的控制器(它应该是 initWithNibName:bundle: 如果在 xib 中制作,就像 0x7fffffff 在情节提要中所说的那样)。

其次,您无法从 didSelectRowAtIndexPath 访问 serviceViewController 中的标签,因为它的视图尚未加载。因此,与其在 didSelectRowAtIndexPath 中设置标签,不如在 serviceViewController 中有一个字符串属性,并为其赋予值 service.text。然后在 viewDidLoad 中,您可以使用该字符串填充您的标签。

于 2013-08-29T23:08:13.020 回答
1

标签是否完全丢失,或者您是否看到它只是没有收到更新的文本?如果标签丢失,则可能是您创建视图控制器的方式存在问题。例如,如果您正在使用情节提要,您应该像这样访问视图控制器:

ServiceViewController *controller = [self.storyboard instantiateViewControllerWithIdentifier:@"SomeStoryBoardID"];

而不是这个:

ServiceViewController *serviceViewController = [[ServiceViewController alloc] init];

但是,如果您可以看到标签,但它只是没有更新它的文本,那么您应该首先检查 Interface Builder 中的连接检查器,并验证标签的 IBOutlet 是否正确链接。

于 2013-08-29T21:05:42.333 回答