Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 在PrepareForsgue中设置目标视图控制器的NSNumber属性时出错_Iphone_Storyboard_Automatic Ref Counting - Fatal编程技术网

Iphone 在PrepareForsgue中设置目标视图控制器的NSNumber属性时出错

Iphone 在PrepareForsgue中设置目标视图控制器的NSNumber属性时出错,iphone,storyboard,automatic-ref-counting,Iphone,Storyboard,Automatic Ref Counting,我有一个模态视图控制器,它试图设置在prepareforsgue方法中调用它的源视图控制器的标志(NSNumber属性)。它无法生成,错误为“选择器“setGoToEditNewNote:”的实例方法未知”。代码如下: 源代码视图控制器。h: @property (strong, nonatomic) NSNumber *goToEditNewNote; 源代码视图控制器.m: @synthesize goToEditNewNote; ... - (void)viewDidLoad { [s

我有一个模态视图控制器,它试图设置在prepareforsgue方法中调用它的源视图控制器的标志(NSNumber属性)。它无法生成,错误为“选择器“setGoToEditNewNote:”的实例方法未知”。代码如下:

源代码视图控制器。h:

@property (strong, nonatomic) NSNumber *goToEditNewNote;
源代码视图控制器.m:

@synthesize goToEditNewNote;
...

- (void)viewDidLoad
{
[super viewDidLoad];
    // clear the flag
    goToEditNewNote = [[NSNumber alloc] initWithBool:FALSE];
...

- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
    if ([goToEditNewNote boolValue] == TRUE) {
        goToEditNewNote = FALSE;
        [self performSegueWithIdentifier: @"editNote" sender: self];
...
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([[segue identifier] isEqualToString:@"done"]) 
    {
        [self done];
        [[segue destinationViewController] setGoToEditNewNote:TRUE]; <<< get error here
    }
}
模态视图控制器。h:

@property (strong, nonatomic) NSNumber *goToEditNewNote;
模态视图控制器.m:

@synthesize goToEditNewNote;
...

- (void)viewDidLoad
{
[super viewDidLoad];
    // clear the flag
    goToEditNewNote = [[NSNumber alloc] initWithBool:FALSE];
...

- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
    if ([goToEditNewNote boolValue] == TRUE) {
        goToEditNewNote = FALSE;
        [self performSegueWithIdentifier: @"editNote" sender: self];
...
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([[segue identifier] isEqualToString:@"done"]) 
    {
        [self done];
        [[segue destinationViewController] setGoToEditNewNote:TRUE]; <<< get error here
    }
}
-(void)prepareforsgue:(UIStoryboardSegue*)分段发送方:(id)发送方
{
如果([[segue identifier]isEqualToString:@“完成”])
{
[自行完成];

[[segue destinationViewController]setGoToEditNewNote:TRUE];首先,如果您使用的是ARC,则不必使用retain(或release)。您只需实例化一个对象,但不必关心是否要删除它。但是,如果对象相互引用在一个圆中,请注意。如果a引用B,B引用C,C引用a,则您可以通过变量D访问这些变量(其中的点位于a)你不再使用D,A-B-C的圆圈会留在内存中,然后你必须将其中一个A-B-C引用定义为“弱”


但对于您真正的问题:您是否可能错过了实现文件中的@synthesis语句?

错误告诉您没有任何与
“setGoToEditNewNote:”
选择器相对应的实例方法;您是否@synthesis您的属性(或自己编写访问器)?

destinationViewController
属于
id
类型,不包含
goToEditNewNote
属性。您可能希望将
destinationViewController
强制转换为
SourceViewController
类型。这通常是一个警告,但听起来好像您将所有警告都视为错误(我也这样做)

您的
-prepareforsgue:sender:
应该是这样的

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    if ([[segue identifier] isEqualToString:@"done"]) 
    {
        [self done];
        SourceViewController *sourceViewController = (SourceViewController *)[segue destinationViewController];
        [sourceViewController setGoToEditNewNote:[NSNumber numberWithBool:YES]];
    }
}

我也有同样的问题。花了我2天的时间,在网上找不到任何正确的答案。奇怪的是,斯坦福CS193p中的相同代码正在工作。幸运的是,我现在解决了它!错误的原因是忘记导入“xxxx.h”
,其中xxxx是您的segue的目标视图控制器的名称。如果您不导入,它永远不知道xxxx的属性是什么


很简单,现在segue可以工作了。

我已经更新了我的问题以包含synthesis语句,它已经在我的代码中了,所以还有其他错误。我已经更新了我的问题以包含synthesis语句,它已经在我的代码中了,所以还有其他错误。我没有看到循环引用问题。如果你看到了,你可以吗请特别指出。没有循环引用的问题。只想借此机会给出“ARC三句话指南”。此外,如果您将BOOL值设置为NSNumber属性,则应该会收到编译器的警告,而不是运行时错误,但这可能与MarkYou's right所描述的内容有关。将BOOL传递到NSNumber会导致分段错误。我已更新了代码。OP,您不只是使用g a
BOOL
以@M和@D开头。我按照建议这样做了,错误消失了,但是,集合没有返回到源代码视图控制器。我在segue中设置该值后立即记录该值,并按照预期报告了goToEditNewNote=1。然后我将该值记录在源代码视图控制器的ViewWillAspect方法中。它报告goToEditNewNote=0;Mark,最初我使用BOOL,但为了解决或了解更多有关问题,我更改为NSNumber。此链接相关吗?。添加setter并没有为我解决问题。我放弃了使用prepareForSegue设置标志的尝试,并实现了委托协议。问题已解决。我认为我可以d使用prepareForSegue来避免设置委托协议的任务,并已使用其他转换完成此操作,但它似乎不适用于解除模式视图控制器转换。我发布此问题已经有一段时间了,但我认为您是对的。从那时起,我就理解了您的建议。感谢您发布此问题。您是对的如果我们都能互相帮助的话,欢迎你们。我很高兴在这里赢得了第一名。