prepareForSegue:sender:无法更改目标上的属性 VC
prepareForSegue:sender: fails to alter property on destination VC
我不确定我做错了什么。
我有两种模式——编辑和添加。
在 VC1 中,当添加按钮被触摸时,它会转到 VC2,用户可以填写详细信息并在 VC1 的 table 中添加一个条目。这行得通。但是,我希望在 VC2 中显示一些 ProblamaticUILabel "Add Mode." 我尝试在 segue 中设置它,但这不起作用。
如果用户随后触摸他们在 VC1 中创建的 table 单元格,我希望使用相同的 VC2,但我想更改 someProblamaticUILabel 以读取 "Edit Mode." 这不起作用。
我使用故事板将这些连接起来。
下面是一些选择输出
From Segue of VC1
segue.destinationViewController: AppVC2: <AppVC2: 0x146b5f40>
AppVC2.someProblamaticUILabel: (null)
AppVC2.someProblamaticUILabel.text: (null)
From viewDidLoad of VC2: <AppVC2: 0x146b5f40>
AppVC2 someFunctionalAttribute: edit
AppVC2 someProblamaticUILabel: <UILabel: 0x1454efc0; frame = (16 20; 151 54); text = 'Add/Edit'; clipsToBounds = YES; opaque = NO; autoresize = RM+BM; userInteractionEnabled = NO; layer = <_UILabelLayer: 0x1454ef50>>
AppVC2 someProblamaticUILabel.text: Add/Edit
一些代码
//VC1
-(void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
if([segue.identifier isEqualToString:@"AddHomePlayerSegue" ]){
AppVC2 * addHome = (AppVC2 *) segue.destinationViewController;
[addHome setDelegate:self];
addHome.teamType = HOME_TEAM;
addHome.mode = ADD_MODE;
addHome.someProblamaticUILabel.text = @"Add";
}else if([segue.identifier isEqualToString:@"EditVisitorPlayerSegue" ]){
AppVC2 * editVisitor = (AppVC2 *) segue.destinationViewController;
[editVisitor setDelegate:self];
editVisitor.mode = EDIT_MODE;
editVisitor.someProblamaticUILabel.text = @"Edit";
NSLog(@"\n From Segue of VC1");
NSLog(@"\n segue.destinationViewController: AppVC2: %@", editVisitor);
NSLog(@"\n AppVC2.someProblamaticUILabel: %@", editVisitor.someProblamaticUILabel);
NSLog(@"\n AppVC2.someProblamaticUILabel.text: %@", editVisitor.someProblamaticUILabel.text);
}
}
// VC2
- (void)viewDidLoad {
[super viewDidLoad];
NSLog(@"\n From viewDidLoad of VC2: %@", self);
NSLog(@"\n AppVC2 someFunctionalAttribute: %@", self.mode);
NSLog(@"\n AppVC2 someProblamaticUILabel: %@", self.someProblamaticUILabel);
NSLog(@"\n AppVC2 someProblamaticUILabel.text: %@", self.someProblamaticUILabel.text);
}
还有一个问题
告诉 VC2 用户使用 y 数据从 VC1 填充到 VC2 的 x 行的最佳方式是什么?
您的问题可能是因为当您尝试在 UILabel 上设置文本 属性 时,它尚未初始化。 prepareForSegue:
方法在转换之前调用,因此在从故事板加载任何内容之前,以及在 VC2 上调用 viewDidLoad
之前。
试试这个:
• 从您的 prepareForSegue:
方法中删除两行 addHome.someProblamaticUILabel.text = @".....";
。
• 在VC2中,在方法viewDidLoad
中,测试self.mode
并根据这个值设置标签:
-(void)viewDidLoad {
[super viewDidLoad];
if ([self.mode isEqualToString:ADD_MODE]) self.someProblamaticUILabel.text = @"Add";
else if ([self.mode isEqualToString:EDIT_MODE]) self.someProblamaticUILabel.text = @"Edit";
else self.someProblamaticUILabel.text = @"Unknown";
}
您应该检查方法的调用顺序。
首先是
[self performSegueWithIdentifier:@"SEGUE_IDENTIFIER"];
其次,将调用目标视图控制器的 viewDidLoad。
第三,将调用第一个视图控制器中的 prepareForSegue。
与其检查目标视图控制器的 viewDidLoad 中的属性,不如尝试将它们记录到目标视图控制器的 viewDidAppear 中。
希望这对您有所帮助..
我不确定我做错了什么。 我有两种模式——编辑和添加。 在 VC1 中,当添加按钮被触摸时,它会转到 VC2,用户可以填写详细信息并在 VC1 的 table 中添加一个条目。这行得通。但是,我希望在 VC2 中显示一些 ProblamaticUILabel "Add Mode." 我尝试在 segue 中设置它,但这不起作用。
如果用户随后触摸他们在 VC1 中创建的 table 单元格,我希望使用相同的 VC2,但我想更改 someProblamaticUILabel 以读取 "Edit Mode." 这不起作用。
我使用故事板将这些连接起来。
下面是一些选择输出
From Segue of VC1
segue.destinationViewController: AppVC2: <AppVC2: 0x146b5f40>
AppVC2.someProblamaticUILabel: (null)
AppVC2.someProblamaticUILabel.text: (null)
From viewDidLoad of VC2: <AppVC2: 0x146b5f40>
AppVC2 someFunctionalAttribute: edit
AppVC2 someProblamaticUILabel: <UILabel: 0x1454efc0; frame = (16 20; 151 54); text = 'Add/Edit'; clipsToBounds = YES; opaque = NO; autoresize = RM+BM; userInteractionEnabled = NO; layer = <_UILabelLayer: 0x1454ef50>>
AppVC2 someProblamaticUILabel.text: Add/Edit
一些代码
//VC1
-(void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
if([segue.identifier isEqualToString:@"AddHomePlayerSegue" ]){
AppVC2 * addHome = (AppVC2 *) segue.destinationViewController;
[addHome setDelegate:self];
addHome.teamType = HOME_TEAM;
addHome.mode = ADD_MODE;
addHome.someProblamaticUILabel.text = @"Add";
}else if([segue.identifier isEqualToString:@"EditVisitorPlayerSegue" ]){
AppVC2 * editVisitor = (AppVC2 *) segue.destinationViewController;
[editVisitor setDelegate:self];
editVisitor.mode = EDIT_MODE;
editVisitor.someProblamaticUILabel.text = @"Edit";
NSLog(@"\n From Segue of VC1");
NSLog(@"\n segue.destinationViewController: AppVC2: %@", editVisitor);
NSLog(@"\n AppVC2.someProblamaticUILabel: %@", editVisitor.someProblamaticUILabel);
NSLog(@"\n AppVC2.someProblamaticUILabel.text: %@", editVisitor.someProblamaticUILabel.text);
}
}
// VC2
- (void)viewDidLoad {
[super viewDidLoad];
NSLog(@"\n From viewDidLoad of VC2: %@", self);
NSLog(@"\n AppVC2 someFunctionalAttribute: %@", self.mode);
NSLog(@"\n AppVC2 someProblamaticUILabel: %@", self.someProblamaticUILabel);
NSLog(@"\n AppVC2 someProblamaticUILabel.text: %@", self.someProblamaticUILabel.text);
}
还有一个问题 告诉 VC2 用户使用 y 数据从 VC1 填充到 VC2 的 x 行的最佳方式是什么?
您的问题可能是因为当您尝试在 UILabel 上设置文本 属性 时,它尚未初始化。 prepareForSegue:
方法在转换之前调用,因此在从故事板加载任何内容之前,以及在 VC2 上调用 viewDidLoad
之前。
试试这个:
• 从您的 prepareForSegue:
方法中删除两行 addHome.someProblamaticUILabel.text = @".....";
。
• 在VC2中,在方法viewDidLoad
中,测试self.mode
并根据这个值设置标签:
-(void)viewDidLoad {
[super viewDidLoad];
if ([self.mode isEqualToString:ADD_MODE]) self.someProblamaticUILabel.text = @"Add";
else if ([self.mode isEqualToString:EDIT_MODE]) self.someProblamaticUILabel.text = @"Edit";
else self.someProblamaticUILabel.text = @"Unknown";
}
您应该检查方法的调用顺序。
首先是
[self performSegueWithIdentifier:@"SEGUE_IDENTIFIER"];
其次,将调用目标视图控制器的 viewDidLoad。
第三,将调用第一个视图控制器中的 prepareForSegue。
与其检查目标视图控制器的 viewDidLoad 中的属性,不如尝试将它们记录到目标视图控制器的 viewDidAppear 中。
希望这对您有所帮助..