如果我想以编程方式初始化 View ,应该在 viewcontroller 生命周期的哪个位置进行初始化?
最初的直觉是loadView。然而,在这里,我们还没有 View 本身的框架(计算 View 的大小/位置所必需的)。 viewDidLoad 也是如此。
下一个直觉是viewWillAppear——在这里我们(终于)保证了 View 的框架。但是,这有可能在整个 vc 生命周期中被多次调用。 viewDidAppear 等也是如此......
最后,我找到了viewWillLayoutSubviews。这适用于大多数静态布局的初始化 - 然而,每当任何 View 移动时都会再次调用它(与 viewWillAppear 相同的问题)。
我看到了在 loadView 中初始化 View 并在 viewWillLayoutSubviews 中设置它们的框架的建议(因为设置框架应该是幂等的,谁在乎它是否被称为一对次)。但是为什么苹果如此强烈地鼓励 initWithFrame: 作为 UIViews 的标准初始化方法 (https://developer.apple.com/library/ios/documentation/windowsviews/conceptual/viewpg_iphoneos/CreatingViews/CreatingViews.html)?
将我所有的 UIViewController 子类化为一个 initWithViewFrame: 方法会不会很疯狂?这样我就可以传入一个框架,立即在 loadView 中手动设置它并完成它?或者在 viewWillAppear 中有一个 viewHasBeenFormatted 标志更好,如果没有设置,调用 View 的格式然后设置它?
或者这只是苹果公司在说“使用界面生成器否则你就完蛋了”的方式?
感谢任何帮助!
编辑 - 不小心把 loadView 写在了 viewWillAppear 的地方(在最后一段)
更新- 我想我已经接受了没有地方可以更新的事实
看起来你应该initWithFrame: viewDidLoad 中的所有 View (但我想那个 View 的内容不应该将那个框架视为远程最终的?因为它是根据假设推导出来的怎么可能?呃...)。然后在 layoutSubviews 中重新设置它们的框架。并确保手动处理初始布局和由于移动 View 而导致的布局之间的差异......伙计,我觉得我一定会遗漏一些东西......(大笑否认......)
我猜,或者提交并使用 IB。
update2 - viewWillLayoutSubviews 将在其中一个 subview 调整大小时调用。所以它仍然被取消资格,因为它不符合我正在寻找的所需特征的属性 2。 :(
最佳答案
如果您正在使用 IB 进行布局,则可以在 viewDidLoad 中进行额外的 View 初始化(例如,如果您需要执行 IB 不能很好处理的事情,或者如果您有UIView 具有 IB 不支持的属性的子类)。或者,如果您不使用 IB,则 documentation说你应该使用 loadView 来手动初始化你的 View 层次结构。
不过,你是对的,你不能依赖框架在那个时候是准确的。因此,您可以通过每个 View 的 autoResizingMask 属性、布局约束(如果您使用的是 iOS 6 及更高版本)和/或覆盖 layoutSubviews 来完成布局。
我通常的方法是在 IB 中进行某种程度的布局,然后在 viewDidLoad 中进行我需要的任何其他操作(非平凡布局、自定义类等)。然后,如果我有布局来确定 autoResizingMask 没有覆盖(我支持低至 iOS 5),我会覆盖 viewWillAppear(或 layoutSubviews 如果我继承 UIView) 并做一些像素数学。我在 UIView 上有一个类别来帮助解决这个问题,它包含以下内容:
-(void)centerSubviewHorizontally:(UIView *)view pixelsFromTop:(float)pixels;
-(void)centerSubviewHorizontally:(UIView *)view pixelsBelow:(float)pixels siblingView:(UIView *)sibling;
关于iOS - 在哪里初始化 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18660665/
在我的gem中,我需要yaml并且在我的本地计算机上运行良好。但是在将我的gem推送到rubygems.org之后,当我尝试使用我的gem时,我收到一条错误消息=>"uninitializedconstantPsych::Syck(NameError)"谁能帮我解决这个问题?附言RubyVersion=>ruby1.9.2,GemVersion=>1.6.2,Bundlerversion=>1.0.15 最佳答案 经过几个小时的研究,我发现=>“YAML使用未维护的Syck库,而Psych使用现代的LibYAML”因此,为了解决
我需要从一个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=>
我在Rails工作并有以下类(class):classPlayer当我运行时bundleexecrailsconsole然后尝试:a=Player.new("me",5.0,"UCLA")我回来了:=>#我不知道为什么Player对象不会在这里初始化。关于可能导致此问题的操作/解释的任何建议?谢谢,马里奥格 最佳答案 havenoideawhythePlayerobjectwouldn'tbeinitializedhere它没有初始化很简单,因为你还没有初始化它!您已经覆盖了ActiveRecord::Base初始化方法,但您没有调
我是一个Rails初学者,但我想从我的RailsView(html.haml文件)中查看Ruby变量的内容。我试图在ruby中打印出变量(认为它会在终端中出现),但没有得到任何结果。有什么建议吗?我知道Rails调试器,但更喜欢使用inspect来打印我的变量。 最佳答案 您可以在View中使用puts方法将信息输出到服务器控制台。您应该能够在View中的任何位置使用Haml执行以下操作:-puts@my_variable.inspect 关于ruby-on-rails-如何在我的R
我是rails的新手,想在form字段上应用验证。myviewsnew.html.erb.....模拟.rbclassSimulation{:in=>1..25,:message=>'Therowmustbebetween1and25'}end模拟Controller.rbclassSimulationsController我想检查模型类中row字段的整数范围,如果不在范围内则返回错误信息。我可以检查上面代码的范围,但无法返回错误消息提前致谢 最佳答案 关键是您使用的是模型表单,一种显示ActiveRecord模型实例属性的表单。c
这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下
我有用于控制用户任务的Rails5API项目,我有以下错误,但并非总是针对相同的Controller和路由。ActionController::RoutingError:uninitializedconstantApi::V1::ApiController我向您描述了一些我的项目,以更详细地解释错误。应用结构路线scopemodule:'api'donamespace:v1do#=>Loginroutesscopemodule:'login'domatch'login',to:'sessions#login',as:'login',via::postend#=>Teamroutessc
我正在尝试解析一个文本文件,该文件每行包含可变数量的单词和数字,如下所示:foo4.500bar3.001.33foobar如何读取由空格而不是换行符分隔的文件?有什么方法可以设置File("file.txt").foreach方法以使用空格而不是换行符作为分隔符? 最佳答案 接受的答案将slurp文件,这可能是大文本文件的问题。更好的解决方案是IO.foreach.它是惯用的,将按字符流式传输文件:File.foreach(filename,""){|string|putsstring}包含“thisisanexample”结果的
我正在阅读一本关于Ruby的书,作者在编写类初始化定义时使用的形式与他在本书前几节中使用的形式略有不同。它看起来像这样:classTicketattr_accessor:venue,:datedefinitialize(venue,date)self.venue=venueself.date=dateendend在本书的前几节中,它的定义如下:classTicketattr_accessor:venue,:datedefinitialize(venue,date)@venue=venue@date=dateendend在第一个示例中使用setter方法与在第二个示例中使用实例变量之间是