Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/22.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
Ios 调用另一个类的Cocoa Touch方法,但代码不';跑不动_Ios_Objective C_Cocoa - Fatal编程技术网

Ios 调用另一个类的Cocoa Touch方法,但代码不';跑不动

Ios 调用另一个类的Cocoa Touch方法,但代码不';跑不动,ios,objective-c,cocoa,Ios,Objective C,Cocoa,所以,我意识到这与其他几十个问题非常相似,所以让我向你们保证,我已经读过它们,理解MVC,读过书,等等。。。。但我还是被难住了 我有两门课。。。A和B。A将B称为模态序列。B有一个“cancel”按钮,它会自动关闭并返回到a。发生这种情况时,我想在a上调用一个方法(或设置一个属性) 我已经将A导入B并对其进行iVar(也尝试了一个属性),在ViewDidLoad中分配了它,然后尝试各种方法来设置属性或从B的方法(iAction或prepareForSegue)调用A的方法 属性似乎没有任何影响。

所以,我意识到这与其他几十个问题非常相似,所以让我向你们保证,我已经读过它们,理解MVC,读过书,等等。。。。但我还是被难住了

我有两门课。。。A和B。A将B称为模态序列。B有一个“cancel”按钮,它会自动关闭并返回到a。发生这种情况时,我想在a上调用一个方法(或设置一个属性)

我已经将A导入B并对其进行iVar(也尝试了一个属性),在ViewDidLoad中分配了它,然后尝试各种方法来设置属性或从B的方法(iAction或prepareForSegue)调用A的方法

属性似乎没有任何影响。。。没有任何明显的变化,它们记录为未更改。 我可以得到一个要激发的方法的NSLog-这是一个令人鼓舞的健全性检查,但是方法中的其他代码都不会激发

以下是我当前的版本:

A类:

具有隐藏在VDL上的ImageView。 我要么试图让它不隐藏,要么失败了,在调用我的方法之前永远不要创建它

- (void) makeGoalVisible {
    NSLog(@"GOAL"); // this prints

    UIImageView *goal = [[UIImageView alloc] initWithFrame:CGRectMake(906, 442, 61, 93)];
    goal.image = [UIImage imageNamed:@"goalIndicator@2x.png"];

    [self.view addSubview:goal]; // this method works from WITHIN Class A - so I know the code/position is fine

}
B类:

- (IBAction)pressedCancel:(id)sender {
    NSLog(@"CANCEL");

    [self performSegueWithIdentifier:@"setGoal" sender:self];
}

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    NSLog(@"PREP");

    TimelineViewController *host = [[TimelineViewController alloc]init];

    [host makeGoalVisible]; // this calls the method but the method doesnt work
    //[host.goalIndicator setHidden:NO]; // this doesnt work
}
方法中的所有日志按预期顺序打印。。。就像我说的,这个方法是从B类调用的,如果我从A类而不是B类调用它,这个方法中的代码就会被调用


我缺少什么?

尝试使用
segue
调用此
UIViewController
的代码,以便使用
[segue destinationViewController]获取对象因为不需要使用
TimelineViewController*host=[[TimelineViewController alloc]init]创建新的obejct

因此,这就是为什么要打印代码
NSLog(@“目标”)但从单独的对象调用

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    NSLog(@"PREP");
    TimelineViewController *host = [segue destinationViewController];
    [host makeGoalVisible]; 
    //[host.goalIndicator setHidden:NO]; 
}

使用
segue
尝试调用此
UIViewController
代码,以便使用
[segue destinationViewController]获取对象因为不需要使用
TimelineViewController*host=[[TimelineViewController alloc]init]创建新的obejct

因此,这就是为什么要打印代码
NSLog(@“目标”)但从单独的对象调用

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    NSLog(@"PREP");
    TimelineViewController *host = [segue destinationViewController];
    [host makeGoalVisible]; 
    //[host.goalIndicator setHidden:NO]; 
}

你的基本前提是错误的。如果您使用来自to be的模式推送,则需要显式调用dismissViewControllerAnimated:completion:或使用unwind segue

如果您使用
performsguewithidentifier:
从B到A,则您正在创建A的新副本,而不是返回到A的原始实例。您正在创建一个不断增加的模态视图控制器堆栈,这是错误的


从B到A的正常通信技术是在A的prepareForSegue中将A设置为B的代表。然后,在B中,您使用委托在a中进行调用/设置属性。

您的基本前提是错误的。如果您使用来自to be的模式推送,则需要显式调用dismissViewControllerAnimated:completion:或使用unwind segue

如果您使用
performsguewithidentifier:
从B到A,则您正在创建A的新副本,而不是返回到A的原始实例。您正在创建一个不断增加的模态视图控制器堆栈,这是错误的


从B到A的正常通信技术是在A的prepareForSegue中将A设置为B的代表。然后,在B中,您使用委托在a中调用/设置属性。

您试图隐藏/显示什么?这是一个UIImageView…如果它是UIImageView*目标,我在任何地方都没有看到任何属性
setHidden:
。此外,您已经将您的
UIImageView
实例设置为localWell,“goalIndicator”是在类a中声明和合成的UIImageView属性。。。最初我试图访问setter(setHidden,您可以看到我试图在类B方法中调用它),但它不起作用,所以我尝试从不创建/隐藏它,直到从类B调用类A的方法为止。。。所以*目标是被调用方法的完全本地版本,是的。。。很抱歉,我发布的示例代码混合了一些我尝试过的不同策略…你想隐藏/显示什么?这是一个UIImageView…如果它是UIImageView*目标,我在任何地方都没有看到任何属性
setHidden:
。此外,您已经将您的
UIImageView
实例设置为localWell,“goalIndicator”是在类a中声明和合成的UIImageView属性。。。最初我试图访问setter(setHidden,您可以看到我试图在类B方法中调用它),但它不起作用,所以我尝试从不创建/隐藏它,直到从类B调用类A的方法为止。。。所以*目标是被调用方法的完全本地版本,是的。。。对不起,我发布的示例代码有点混合了我尝试过的不同策略…太棒了,它可以工作!非常感谢。(让我尽快接受)。。。但我很好奇,如果我想从iAction调用该方法,但没有对destinationViewController的引用,该怎么办?如果你想调用这个函数,你需要在使用
segue
时初始化
UIViewController
类,并创建一个对象(在使用
[segue destinationViewController];
)两者都是不同的。如果您继续使用代码(不使用
segue
),那么代码将起作用,因为届时您创建的对象将作为
nextViewController
移动。希望这将对您有所帮助:)太棒了,它会起作用!谢谢您。。。(请允许我尽快接受)…但我很好奇,如果我想从iAction调用该方法,但没有对destinationViewController的引用,该怎么办?如果你想调用该函数,你需要在使用
segue
创建对象时初始化
UIViewController
类(当您使用
[segue destin]获取参考时