这个真的很奇怪。这是错误:
***** 由于未捕获的异常“NSGenericException”而终止应用程序,原因:“无法在 View 上安装约束。约束是否引用了 View 子树之外的内容?那是非法的。约束: View :>'**
所以我的自定义单元格有一个 subview ,我是在配置步骤中添加的。也就是说,我 deuque 一个单元格,然后用一个数据对象配置它。在配置步骤中,如果不存在则添加第三方 subview :
if (!self.thirdPartyAnswerView) {
self.thirdPartyAnswerView = [TCThirdPartyAPIHelper thirdPartyAnswerViewForThirdPartyAPIServiceType:answer.thirdPartyObject.thirdPartyAPIType];
self.thirdPartyAnswerView.translatesAutoresizingMaskIntoConstraints = NO;
[self.contentWrapperView addSubview:self.thirdPartyAnswerView];
NSDictionary *metrics = @{
@"TC_CELL_TOP_PADDING": [NSNumber numberWithFloat:TC_CELL_TOP_PADDING],
@"TC_CELL_BOTTOM_PADDING": [NSNumber numberWithFloat:TC_CELL_BOTTOM_PADDING],
@"TC_CELL_RIGHT_PADDING": [NSNumber numberWithFloat:TC_CELL_RIGHT_PADDING],
@"TC_CELL_LEFT_PADDING": [NSNumber numberWithFloat:TC_CELL_LEFT_PADDING],
};
[self.contentWrapperView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"|-TC_CELL_LEFT_PADDING-[_thirdPartyAnswerView]-TC_CELL_RIGHT_PADDING-|" options:0 metrics:metrics views:NSDictionaryOfVariableBindings(_thirdPartyAnswerView)]];
[self.contentWrapperView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-TC_CELL_TOP_PADDING-[_thirdPartyAnswerView]-TC_CELL_BOTTOM_PADDING-|" options:0 metrics:metrics views:NSDictionaryOfVariableBindings(_thirdPartyAnswerView)]];
}
一切正常。事实上,它工作得很好。我进入我的答案单元格(呈现模态编辑/创建流程),然后完成并返回到同一屏幕。我用动画很好地更新了行,而不是调用 reloadData。
当我在拥有现有数据后点击类别按钮时,问题就出现了。它拉出一个类别选择模式。当我选择一个类别时,它会在上一个屏幕中调用 reloadData,然后将类别模式动画化。好吧,至少那是它应该做的。 相反,它会在动画开始时立即崩溃。它调用 reloadData 没有问题,但是一旦动画开始,boom。 它要么抛出我上面显示的崩溃,不提供任何解释,要么崩溃并提示_supportsContentDimensionVariables 选择器被发送到错误的对象。
由于使用的 View 可能因单元格而异,因此在调用 prepareForReuse 时,我删除了 thirdPartyAnswerView。如果我删除它,它不会崩溃(但是我在我的单元格中有一个我不想要的 View )。我尝试删除之前和之后的约束:
if (self.thirdPartyAnswerView) {
[self.contentWrapperView removeConstraints:self.thirdPartyAnswerView.constraints];
[self.thirdPartyAnswerView removeFromSuperview];
self.thirdPartyAnswerView = nil;
}
那没用。我尝试将这些东西从 prepareForReuse 中移出并移到配置部分(在添加新 subview 之前删除 subview )。那没有用。我很茫然。
以下是选择模态中的类别时调用的代码:
categorySelectionVC.didTouchCategoryBlock = ^(TCCategory *category) {
TCQuestionBuilderViewController *sself = weakself;
sself.category = category;
[sself.tableView reloadData];
[sself.tableView selectRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:TableSectionCategory] animated:NO scrollPosition:UITableViewScrollPositionNone];
[sself dismissViewControllerAnimated:YES completion:^{
}];
};
我后来确定的是,如果我在重新加载后注释掉 selectRowAtIndexPath 位,它会正常工作。我不明白的是为什么。这个我用过很多次。我重新加载数据,重新选择所选择的内容,以便在再次看到 tableView 时动画“关闭”。
我错了。虽然删除它最初确实解决了问题,但如果您再次进入模式,然后再次选择一个类别,它就会崩溃。
感谢 sapi,我发现约束没有被正确删除。使用 thirdPartyView 的 constraints 属性不包括存储在父 View 上的约束。不得不使用这种语法,虽然我猜有一种更短的方法可以做到这一点:
for (NSLayoutConstraint *constraint in self.contentWrapperView.constraints) {
if (constraint.firstItem == self.thirdPartyAnswerView || constraint.secondItem == self.thirdPartyAnswerView) {
[constraints addObject:constraint];
}
}
[self.contentWrapperView removeConstraints:constraints];
最佳答案
约束是双向的,但反向关系由与正向关系不同的对象表示。
如果您创建一个约束,例如:
[self.contentWrapperView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"|-TC_CELL_LEFT_PADDING-[_thirdPartyAnswerView]-TC_CELL_RIGHT_PADDING-|" options:0 metrics:metrics views:NSDictionaryOfVariableBindings(_thirdPartyAnswerView)]];
然后 self.contentWrapperView 和 _thirdPartyAnswerView 都添加了约束,但是虽然它们都表示相同的关系,但它们是不同的对象 .
当你打电话时:
[self.contentWrapperView removeConstraints:self.thirdPartyAnswerView.constraints];
这会尝试移除 self.contentWrapperView 上的所有约束,这些约束与 self.thirdPartyAnswerView 上的约束相同,即没有约束。
要删除适当的约束,您必须遍历数组并识别引用 thirdPartyAnswerView 的那些(请参阅编辑问题以了解一种执行此操作的方法)。
关于ios - reloadData 后翻转回 tableView 时出现 Illegal constrain 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15669291/
我正在用Ruby编写一个简单的程序来检查域列表是否被占用。基本上它循环遍历列表,并使用以下函数进行检查。require'rubygems'require'whois'defcheck_domain(domain)c=Whois::Client.newc.query("google.com").available?end程序不断出错(即使我在google.com中进行硬编码),并打印以下消息。鉴于该程序非常简单,我已经没有什么想法了-有什么建议吗?/Library/Ruby/Gems/1.8/gems/whois-2.0.2/lib/whois/server/adapters/base.
大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje
我想为Heroku构建一个Rails3应用程序。他们使用Postgres作为他们的数据库,所以我通过MacPorts安装了postgres9.0。现在我需要一个postgresgem并且共识是出于性能原因你想要pggem。但是我对我得到的错误感到非常困惑当我尝试在rvm下通过geminstall安装pg时。我已经非常明确地指定了所有postgres目录的位置可以找到但仍然无法完成安装:$envARCHFLAGS='-archx86_64'geminstallpg--\--with-pg-config=/opt/local/var/db/postgresql90/defaultdb/po
我遵循MichaelHartl的“RubyonRails教程:学习Web开发”,并创建了检查用户名和电子邮件长度有效性的测试(名称最多50个字符,电子邮件最多255个字符)。test/helpers/application_helper_test.rb的内容是:require'test_helper'classApplicationHelperTest在运行bundleexecraketest时,所有测试都通过了,但我看到以下消息在最后被标记为错误:ERROR["test_full_title_helper",ApplicationHelperTest,1.820016791]test
我是rails的新手,想在form字段上应用验证。myviewsnew.html.erb.....模拟.rbclassSimulation{:in=>1..25,:message=>'Therowmustbebetween1and25'}end模拟Controller.rbclassSimulationsController我想检查模型类中row字段的整数范围,如果不在范围内则返回错误信息。我可以检查上面代码的范围,但无法返回错误消息提前致谢 最佳答案 关键是您使用的是模型表单,一种显示ActiveRecord模型实例属性的表单。c
我正在尝试编写一个将文件上传到AWS并公开该文件的Ruby脚本。我做了以下事情:s3=Aws::S3::Resource.new(credentials:Aws::Credentials.new(KEY,SECRET),region:'us-west-2')obj=s3.bucket('stg-db').object('key')obj.upload_file(filename)这似乎工作正常,除了该文件不是公开可用的,而且我无法获得它的公共(public)URL。但是当我登录到S3时,我可以正常查看我的文件。为了使其公开可用,我将最后一行更改为obj.upload_file(file
我克隆了一个rails仓库,我现在正尝试捆绑安装背景:OSXElCapitanruby2.2.3p173(2015-08-18修订版51636)[x86_64-darwin15]rails-v在您的Gemfile中列出的或native可用的任何gem源中找不到gem'pg(>=0)ruby'。运行bundleinstall以安装缺少的gem。bundleinstallFetchinggemmetadatafromhttps://rubygems.org/............Fetchingversionmetadatafromhttps://rubygems.org/...Fe
在Cooper的书BeginningRuby中,第166页有一个我无法重现的示例。classSongincludeComparableattr_accessor:lengthdef(other)@lengthother.lengthenddefinitialize(song_name,length)@song_name=song_name@length=lengthendenda=Song.new('Rockaroundtheclock',143)b=Song.new('BohemianRhapsody',544)c=Song.new('MinuteWaltz',60)a.betwee
这里有一个很好的答案解释了如何在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返回它复制的字节数,但是当我还没有下
我是Google云的新手,我正在尝试对其进行首次部署。我的第一个部署是RubyonRails项目。我基本上是在关注thisguideinthegoogleclouddocumentation.唯一的区别是我使用的是我自己的项目,而不是他们提供的“helloworld”项目。这是我的app.yaml文件runtime:customvm:trueentrypoint:bundleexecrackup-p8080-Eproductionconfig.ruresources:cpu:0.5memory_gb:1.3disk_size_gb:10当我转到我的项目目录并运行gcloudprevie