gpt4 book ai didi

ios - 从另一个 UIViewController 调用方法没有可见效果

转载 作者:可可西里 更新时间:2023-11-01 04:25:14 25 4
gpt4 key购买 nike

我有两个类,想在按下按钮时调用一个类的方法。我在我的 .h 文件中这样声明它:

-(void) imageChange;

然后我在我的 .m 中创建了这样的方法:

-(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];

}

但是,当我在我的 View Controller 中按下“完成”时,UIImage 不会改变。请注意:img 是一个 NSString 值。

最佳答案

这个问题是一个常见问题的变体:“如何在 View Controller 之间传递值”,您的代码代表了对解决方案的常见尝试。让我们从您所做的开始。

您的应用程序有两个 View Controller ,它们在 View 堆栈上有 View ,您想要在它们之间进行通信。这一行:

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

创建一个全新的 SecondViewController 实例(alloc 意味着为此类的新实例分配内存)。这一行:

[theInstance imageChange];

向它传达一些信息,在您的情况下,它看起来像是设置 ImageView 的图像。然后这一行:

}

隐含地销毁了那个新实例,因为它再也没有被引用过。因此,您的代码成功地与 SecondViewController 进行了通信,但是使用了错误的实例,一个仅存在几毫秒的实例。

好的,怎么办? @rmaddy 所说的是找到 SecondViewController 的现有实例,并与之通信。如何获得现有实例取决于我们如何到达这里。您代码中的 dismissViewControllerAnimated 让我认为当前的 vc 是由 SecondVC 的实例呈现的。如果是这样,

(SecondViewController *)self.presentingViewController

指向你需要的东西。如果我们在 UINavigationController 中,您可以深入了解它的 viewControllers 堆栈,可能在这里:

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

但是,虽然所有这些可能都是从 A 到 B 的最直线,但它并不是很好的设计,因为它使当前 View Controller 以一种脆弱的方式依赖于它的呈现方式。

因此@CrimsonChris 提出了一个考虑委派的好建议。对于需要与另一个人交流的 vc,这是大多数人的首选模式。关于如何执行此操作的 Web 和 SO 资源很多,因此我不会在这里重复。 Check out this, for example ,或谷歌“iOS 代表团”。

还有其他方法,比如 NSNotificationCenter 可以向所有感兴趣的人广播您想交流的任何内容,或者 KVO 让 SecondVC 观察模型的变化并使用react,无论如何或为什么进行了更改。

后两者的关键概念是您的应用需要有一个模型,即一组描述应用状态的对象。 View Controller 不是模型——事实上它们完全不是模型。他们的工作是了解模型变化并相应地修改 View 。

对于您的情况,您发布的代码不应该试图在另一个 View Controller 中设置图像,它应该将触发解雇的任何用户操作记录到模型中。当当前的 vc 关闭自身时,SecondViewController(假设它完成了当前)将获得 viewWillAppear。该方法可能是检查针对用户操作设置的模型条件的好地方。然后 SecondViewController 可以调用自身的 imageChange。

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

关于ios - 从另一个 UIViewController 调用方法没有可见效果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24312447/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com