prepareForSegue 没有设置 UILabel

prepareForSegue not setting UILabel

我有一个 prepareForSegue 方法设置,它将我想要的所有内容发送到 destinationViewController,除了 destinationVC 上的 UILabel 的值。我扔了一个 NSLog 语句来查看它打印了什么值,它打印了我想要的。

它没有崩溃,但没有设置。我知道我在这里遗漏了一些非常基本的东西,但它并没有跳出来。

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(UIButton *)sender {
    if ([[segue identifier] isEqualToString:@"directionsSegue"]) {
        // Set destination view controller
        DirectionsViewController *destinationVC = segue.destinationViewController;

        // Pick out the "thing" you want to send to destinationVC
        CGPoint point = [sender convertPoint:CGPointZero toView:self.tableView];
        NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:point];

        // Set the "thing" on the destinationVC
        PointOfInterest *poi = [self.fetchedResultsController objectAtIndexPath:indexPath];
        destinationVC.destinationLabel.text = poi.name;
        NSLog(@"destinationVC.destinationLabel.text = %@", poi.name);
        destinationVC.destinationLatitude = poi.latitude;
        destinationVC.destinationLongitude = poi.longitude;

    }
}

我的 属性 在我的目标 VC 的 header 中声明:

@property (strong, nonatomic) IBOutlet UILabel *destinationLabel;

来自以下答案的解决方案:

谜底揭晓!这是我所做的:

在我的 destinationVC 上,我将其添加到我的 header:

@property (nonatomic, strong) NSString *destinationName;

我把这个放回实现中:

@property (strong, nonatomic) IBOutlet UILabel *destinationLabel;

destinationVC 中,我将此添加到我的 viewDidLoad:

self.destinationLabel.text = self.destinationName;

您的标签在 prepareForSegue 中将为 nil,因为此时它不会被实例化。事实上,一旦您的视图被加载,IBOutlet 就会被初始化。这就是它不起作用的原因。

解决您的问题的最佳方法是在您的 DirectionsViewController 中创建另一个 属性 来存储您的文本。这个在你的控制器初始化后就可以直接使用,然后你可以在你的控制器的任何地方直接设置你的标签。

IBOutlet 对象在加载视图控制器的视图之前不会被初始化。那发生在 segue 之后。创建自定义 属性 并在准备期间更新它,然后在 viewDidLoad 期间将其复制到您的标签。