调用方法从另一个UIViewController没有可见的影响

我有两个类,并希望从一个类按下button时调用方法。 我在我的.h文件中声明如下:

-(void) imageChange; 

我在我的.m中创build了这样的方法:

 -(void)imageChange { UIImage *image = [UIImage imageNamed: img]; [_MyImage setImage:image]; } 

最后,我尝试从另一个类中调用方法:

 - (IBAction)Done:(id)sender { SecondViewController *theInstance = [[SecondViewController alloc] init]; [theInstance imageChange]; [self dismissViewControllerAnimated:YES completion:nil]; } 

但是,当我在视图控制器中按“完成”, UIImage不会改变。 请注意: img是一个NSString值。

问题是一个常见的变体:“如何在视图控制器之间传递值”,而你的代码是一个解决scheme的共同尝试。 让我们从你所做的事开始。

你的应用程序有两个视图控制器,在视图堆栈上有视图,并且你想在它们之间进行通信。 这一行:

 SecondViewController *theInstance = [[SecondViewController alloc] init]; 

创build一个全新的SecondViewController实例(alloc是指为这个类的新实例分配内存)。 这一行:

 [theInstance imageChange]; 

与它沟通的东西,在你的情况下,它看起来像设置图像视图的图像。 那么这一行:

 } 

隐含地破坏了新的实例,因为它再也没有被引用。 所以你的代码成功地与SecondViewController进行通信,但是却有一个错误的实例,这个实例只存在几毫秒。

好的,该怎么办? @rmaddy说的是去findSecondViewController的现有实例,并与之通信。 如何获得现有的实例取决于我们如何到达这里。 代码中的dismissViewControllerAnimated使我认为这个当前的vc是由SecondVC的一个实例提供的。 如果是这样,

 (SecondViewController *)self.presentingViewController 

指出你需要什么。 如果我们在UINavigationController ,你可以通过它的viewControllers堆栈,可能在这里:

 NSArray *stack = self.navigationController.viewControllers; SecondViewController *secondVC = stack[stack.count-2]; 

但是,虽然所有这些可能是从A到B的最直线,但这并不是很好的devise,因为它使得当前的视图控制器以一种脆弱的方式依赖于它如何呈现。

因此@CrimsonChris提出考虑考察团的build议。 这是大多数人需要与另一个人沟通的vc模式。 如何做到这一点,有很多networking和SO资源,所以我不在这里重复。 看看这个,例如 ,或谷歌“iOS委托”。

还有其他一些方法,比如NSNotificationCenter可以向想要沟通的所有人发送广播,或者KVO让SecondVC观察模型的变化并作出反应,无论变化如何或者为什么发生。

后两者的关键概念是您的应用程序需要有一个模型,一组描述应用程序状态的对象。 视图控制器不是模型 – 事实上它们并不是模型。 他们的工作是了解模型更改并相应地修改视图。

对于你的情况,你发布的代码不应该试图获取在其他视图控制器中设置的图像,它应该logging到模型中,无论发生什么用户动作触发解雇。 当这个当前vc解散时,SecondViewController(假设它现在)会得到一个viewWillAppear。 该方法可能是检查在用户操作中设置的模型条件的好地方。 然后SecondViewController可以自己调用imageChange。

希望已经够清楚了。 祝你好运。