Objective c 目标C(iOS):准备工作赢得';我无法将数据传递到目标VC
VC1=Objective c 目标C(iOS):准备工作赢得';我无法将数据传递到目标VC,objective-c,ios,xcode,Objective C,Ios,Xcode,VC1=NewGameViewController VC2=GameViewController NewGameViewController.m - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { if( [segue.identifier isEqualToString:@"newGameSegue"]) { GameViewController *gameVC = (GameViewContro
NewGameViewController
VC2=
GameViewController
NewGameViewController.m
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if( [segue.identifier isEqualToString:@"newGameSegue"]) {
GameViewController *gameVC = (GameViewController *)segue.destinationViewController;
NSArray *array = [self nameArrayForTextFieldArray:self.namePicker.textFieldArray withColon:YES];
gameVC.nameArray = [[NSArray alloc] initWithArray:array];
}
-(NSArray*)名称数组fortextfieldArray:(NSArray*)带冒号的数组:(BOOL*)BOOL
基本上,如果给定一组文本字段,则返回一组字符串。withcolon是一个布尔值,表示您是否希望字符串的末尾附加一个冒号
当我调试我的代码时,gameVC中的_nameArrayIVAR在这里的每一行被调用后仍然读取nil…这里有人能帮我吗???GameViewController是否嵌入到导航控制器中?在这种情况下,destinationViewController属性的类型为UINavigationController,而不是GameViewController。您可以通过调用
[segue.destinationViewController.viewControllers lastObject]
来访问GameViewController。我假设您在设置gameVC.nameArray
之前已经完成了数组的NSLog(或在调试器中检查)。你真的想确保它是按你认为的方式设置的。令人惊讶的是,我花了多少时间调试类似的东西,却发现问题出在我的等价物nameArrayForTextFieldArray
中。或序列标识符名称中的键入错误。或者像这样的随机事件
假设没问题,那么有两件事是可能的:
如何在GameViewController
中定义您的nameArray
属性?如果它不是强
引用(或副本
),则当数组
超出范围时,它将被解除分配。我认为这会表现得稍有不同,但值得确认
此外,我还见过像GameViewController
这样的控制器可能会混淆各种IVAR和属性(这就是为什么我从不为属性定义IVAR…我让@synthesis
这样做)
我假设您没有为nameArray
使用自定义setter。我只是想确定一下。如果是这样的话,也请分享一下
一句话,您能否在您的GameViewController
的@界面
以及它的@synthesis
语句中向我们显示对nameArray
的所有引用?当要执行从一个屏幕到另一个屏幕的切换时,UIKit将调用prepareForSegue方法。它允许我们在显示新的视图控制器之前将数据提供给它。通常,您可以通过设置其属性来实现这一点
可以在segue.destinationViewController中找到新的视图控制器。如果GameViewController嵌入导航控制器,则新的视图控制器将不是GameViewController,而是嵌入它的导航控制器。
要获取GameViewController对象,我们可以查看导航控制器的topViewController属性。此属性指的是导航控制器内当前处于活动状态的屏幕
要将对象发送到新的视图控制器,您可以使用以下解决方案使用performsguewithidentifier
:
例如,如果我们想按ui按钮执行一个序列,我们可以这样做:
在MyViewController.h
中,我们创建一个iAction(连接到UIButton),将按钮从情节提要拖动到代码:
- (IBAction)sendData:(id)sender;
在MyViewController.m
中,我们实现了以下方法:
- (IBAction)sendData:(id)sender
{
NSArray *array = [self nameArrayForTextFieldArray:self.namePicker.textFieldArray withColon:YES];
[self performSegueWithIdentifier:@"newGameSegue" sender:array];
}
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
if ([segue.identifier isEqualToString:@"newGameSegue"]) {
UINavigationController *navigationController = segue.destinationViewController;
GameViewController *controller = (GameViewController *)navigationController.topViewController;
controller.nameArray = sender;
}
}
对于这个sendData方法,您的意思是将它用作调用segue的按钮的iAction吗?是的,我使用了一个通用方法。其思想是为特定事件调用一个方法。按下按钮在单元格中单击,以此类推。