我有两个类,想在按下按钮时调用一个类的方法。我在我的 .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/
我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div
总的来说,我对ruby还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用
类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc
我正在尝试设置一个puppet节点,但rubygems似乎不正常。如果我通过它自己的二进制文件(/usr/lib/ruby/gems/1.8/gems/facter-1.5.8/bin/facter)在cli上运行facter,它工作正常,但如果我通过由rubygems(/usr/bin/facter)安装的二进制文件,它抛出:/usr/lib/ruby/1.8/facter/uptime.rb:11:undefinedmethod`get_uptime'forFacter::Util::Uptime:Module(NoMethodError)from/usr/lib/ruby
我想了解Ruby方法methods()是如何工作的。我尝试使用“ruby方法”在Google上搜索,但这不是我需要的。我也看过ruby-doc.org,但我没有找到这种方法。你能详细解释一下它是如何工作的或者给我一个链接吗?更新我用methods()方法做了实验,得到了这样的结果:'labrat'代码classFirstdeffirst_instance_mymethodenddefself.first_class_mymethodendendclassSecond使用类#returnsavailablemethodslistforclassandancestorsputsSeco
我好像记得Lua有类似Ruby的method_missing的东西。还是我记错了? 最佳答案 表的metatable的__index和__newindex可以用于与Ruby的method_missing相同的效果。 关于ruby-难道Lua没有和Ruby的method_missing相媲美的东西吗?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/7732154/
使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta
我需要从一个View访问多个模型。以前,我的links_controller仅用于提供以不同方式排序的链接资源。现在我想包括一个部分(我假设)显示按分数排序的顶级用户(@users=User.all.sort_by(&:score))我知道我可以将此代码插入每个链接操作并从View访问它,但这似乎不是“ruby方式”,我将需要在不久的将来访问更多模型。这可能会变得很脏,是否有针对这种情况的任何技术?注意事项:我认为我的应用程序正朝着单一格式和动态页面内容的方向发展,本质上是一个典型的网络应用程序。我知道before_filter但考虑到我希望应用程序进入的方向,这似乎很麻烦。最终从任何
我想要做的是有2个不同的Controller,client和test_client。客户端Controller已经构建,我想创建一个test_clientController,我可以使用它来玩弄客户端的UI并根据需要进行调整。我主要是想绕过我在客户端中内置的验证及其对加载数据的管理Controller的依赖。所以我希望test_clientController加载示例数据集,然后呈现客户端Controller的索引View,以便我可以调整客户端UI。就是这样。我在test_clients索引方法中试过这个:classTestClientdefindexrender:template=>
我在我的项目中添加了一个系统来重置用户密码并通过电子邮件将密码发送给他,以防他忘记密码。昨天它运行良好(当我实现它时)。当我今天尝试启动服务器时,出现以下错误。=>BootingWEBrick=>Rails3.2.1applicationstartingindevelopmentonhttp://0.0.0.0:3000=>Callwith-dtodetach=>Ctrl-CtoshutdownserverExiting/Users/vinayshenoy/.rvm/gems/ruby-1.9.3-p0/gems/actionmailer-3.2.1/lib/action_mailer