0

我有一个名为“FirstViewController”的表格视图,当我选择表格中的任一单元格时,它将推送到“SecondViewController”。SecondViewController 有一个名为“randomTitle”的 UILabel,我需要根据 FirstViewController 上选定的单元格进行更改。

因此,如果选定的单元格被命名为“随机行”,我需要将 UILabel 更改为那个。

到目前为止,我尝试了这个,但运气不佳。这在 FirstViewController 中:

SecondViewController *secondView = [[SecondViewController alloc] init];
secondView.randomTitle.text = @"Test"; // hardcoding it for now

[self.navigationController pushViewController:secondView animated:YES];

但是标签没有改变。我错过了什么?笔尖连接正确。这是 SecondViewController 的 .h 的样子:

@interface SecondViewController : UIViewController
{
    UILabel *randomTitle;
}

@property (nonatomic, retain) IBOutlet UILabel *randomTitle;
4

3 回答 3

1

恭喜,您刚刚遇到了导致如此可怕的错误的事情,这被称为“您可以毫无问题地调用 nil 上的任何方法”。

当您将文本设置为标签时,它还没有设置到插座中(因为控制器没有开始加载它的视图;它会在您推送它之后立即执行)。

为了使您的代码保持干净和可维护,我建议创建一个属性来保存文本(或者,更好的是,与所选行关联的模型)并在第二个控制器的 viewWillAppear 中使用它来配置其表示。

PS为了证明我是对的,只需在推送后放置文本分配:)

于 2012-11-09T02:34:36.573 回答
0

在您希望设置其文本属性时,您的标签似乎尚未正确初始化。将以下代码添加到您的 SecondViewController 的init方法中:

randomTitle = [[UILabel alloc] init];

假设它在 IB 中正确连接,randomTitle 标签将采用您在 IB 中设置的所有属性。在任何情况下,您都需要显式地alloc-init设置标签,然后才能设置其文本,就像在 FirstViewController 方法中所做的那样。

于 2012-11-09T02:30:16.773 回答
0

注意:我知道使用故事板/segues 是如何工作的,但是对于没有 segues 的推送视图,以下内容应该适用于第二个视图控制器,但必须对第一个视图控制器进行一些调整

(nonatomic, copy)属性用于NSString

.h您的第二个视图控制器的文件中,创建一个NSString充当“传输字符串”

@property (nonatomic, copy) NSString *transferString;

在您.m的第二个视图控制器的文件中,合成和解除分配等以及您的 viewDidLoad:

-(void)viewDidLoad
{
    [super viewDidLoad];

    randomTitle.text = transferString;
}

这会根据输入显示您想要的特定文本。现在要传递文本,您需要转到您的第一个视图控制器;所有这些都发生在.m文件中。首先,导入第二个视图控制器:

#import "SecondViewController.h"

对于你的 Segue:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([segue.identifier isEqualToString:@"SegueName"]) 
    {        
        [[segue destinationViewController] setTransferString:[NSString stringWithFormat:@"%@", [yourArray objectAtIndex:yourTableView.indexPathForSelectedRow.row]]];
    }
}

yourArray你用来填充的 NSArray在哪里yourTableView

于 2012-11-09T02:36:24.003 回答