Ios 调用另一个类的Cocoa Touch方法,但代码不';跑不动
所以,我意识到这与其他几十个问题非常相似,所以让我向你们保证,我已经读过它们,理解MVC,读过书,等等。。。。但我还是被难住了 我有两门课。。。A和B。A将B称为模态序列。B有一个“cancel”按钮,它会自动关闭并返回到a。发生这种情况时,我想在a上调用一个方法(或设置一个属性) 我已经将A导入B并对其进行iVar(也尝试了一个属性),在ViewDidLoad中分配了它,然后尝试各种方法来设置属性或从B的方法(iAction或prepareForSegue)调用A的方法 属性似乎没有任何影响。。。没有任何明显的变化,它们记录为未更改。 我可以得到一个要激发的方法的NSLog-这是一个令人鼓舞的健全性检查,但是方法中的其他代码都不会激发 以下是我当前的版本: A类: 具有隐藏在VDL上的ImageView。 我要么试图让它不隐藏,要么失败了,在调用我的方法之前永远不要创建它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的方法 属性似乎没有任何影响。
- (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]获取参考时