我的问题看起来很奇怪。我正在使用 Swift 和 iOS9+。
我在 Storyboard 中设置了一个 UIViewController,其中包含一些 View 和一个 tableview。 ( View 在 tableview 的垂直上方)所有设置都使用自动布局正确设置,没有警告并且 UIViewController 正确显示。
在 viewDidLoad() 中,我从 API 请求一些 TableView 数据并在获得响应后调用 tableView.reloadSections(),该部分正确淡出。
如果我点击部分标题中的按钮,则会出现另一个 View Controller ,我可以在其中过滤请求的数据。设置过滤器后, View Controller 关闭并在委托(delegate)中调用 refreshVitalSigns(...)。
然后,我想重新加载 TableView 部分以仅显示过滤后的数据。当我再次调用reloadSections()时,我得到了很多不满意的约束警告并且 View 乱七八糟,我不知道为什么?????
使用 reloadData() 一切正常,但我只想重新加载该部分。
仅供引用:请求 API 数据后,您必须滚动才能看到整个 TableView 内容。如果我先滚动查看全部内容,然后再进行过滤,那么 reloadSections() 也能正常工作!显然,它也应该在不先滚动的情况下工作......
你知道为什么会发生这种奇怪的行为吗?
我很感激每一个提示!!!
最佳
class JMProfileViewController: UIViewController {
/// Table view top spacing
@IBOutlet weak var tableViewTopSpacing: NSLayoutConstraint!
/// Table view
@IBOutlet var tableView: UITableView!
/// Attention view
@IBOutlet var attentionView: JMAttentionView?
var vitalSigns: [Items] = []
var data: [Items] = []
...
// View did load
override func viewDidLoad() {
super.viewDidLoad()
...
// Table view row height
tableView.rowHeight = UITableViewAutomaticDimension
tableView.estimatedRowHeight = 44.0
// Register custom tableview header/footer views and cells
...
// Get table view data
let patientId = ...
getData(patientId)
}
/**
Get data
- parameter patientId: Patient ID
*/
func getData(patientId: Int) {
// Request
APIController.sharedInstance.getData(patientId: patientId) { response in
// Result handling
switch response {
case .Success(let result):
// Update vital signs
self.vitalSigns = result
self.data = result
// Reload data
self.tableView.beginUpdates()
self.tableView.reloadSections(NSIndexSet(index: 1), withRowAnimation: .Fade)
self.tableView.endUpdates()
case .Failure(let error):
print(error)
}
}
}
override func updateViewConstraints() {
super.updateViewConstraints()
// Set constraints depending on view's visibility
if let view = attentionView {
if view.hidden {
tableViewTopSpacing.constant = 0
} else {
tableViewTopSpacing.constant = view.bounds.height
}
}
}
// MARK: - Navigation
// Preparation before navigation
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
// Data segue
if segue.identifier == SegueIdentifier.JMVitalSignsSegue.rawValue {
let vsvc = segue.destinationViewController as! JMVitalSignsViewController
vsvc.delegate = self
}
}
}
// MARK: - UITableViewDataSource
extension JMProfileViewController: UITableViewDataSource {
// Number of sections in table view
func numberOfSectionsInTableView(tableView: UITableView) -> Int {
return 3
}
// Height for header in section
func tableView(tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat {
return section == 0 ? 0 : UITableViewAutomaticDimension
}
// Estimated height for header in section
func tableView(tableView: UITableView, estimatedHeightForHeaderInSection section: Int) -> CGFloat {
return section == 0 ? 0 : 27.0
}
// View for header in section
func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
switch section {
case 0:
// First section without header
return nil
case 1:
// Configure header
let header = tableView.dequeueReusableHeaderFooterViewWithIdentifier(CellIdentifier.JMTitleButtonHeaderView.rawValue) as! JMTitleButtonHeaderView
header.configure(NSLocalizedString("vitalSigns", comment: ""), buttonTarget: self, buttonImage: UIImage(named: "ic_filter_dark"), buttonAction: #selector(parameterButtonTapped(_:)))
return header
default:
// Configure header
let header = tableView.dequeueReusableHeaderFooterViewWithIdentifier(CellIdentifier.JMTitleButtonHeaderView.rawValue) as! JMTitleButtonHeaderView
header.configure(NSLocalizedString("others", comment: ""))
return header
}
}
/**
Vital signs button tapped
*/
func parameterButtonTapped(sender: UIButton) {
// Show vital signs view controller
self.performSegueWithIdentifier(SegueIdentifier.JMVitalSignsSegue.rawValue, sender: self)
}
// Number of rows in section
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
var rows = 0
switch section {
case 0:
// Diagnosis
rows = 1
break
case 1:
// Vital signs
rows = data.count > 0 ? data.count : 1
break
case 2:
// Others
rows = 3
break
default:
break
}
return rows
}
// Cell for row at indexpath
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
switch indexPath.section {
case 0:
let cell = tableView.dequeueReusableCellWithIdentifier(CellIdentifier.JMSubtitleImageRightDetailCell.rawValue, forIndexPath: indexPath) as! JMSubtitleImageRightDetailCell
// Configure cell
...
return cell
case 1:
if data.count > 0 {
let cell = tableView.dequeueReusableCellWithIdentifier(CellIdentifier.JMTitleThreeLabelsSubtitleCell.rawValue, forIndexPath: indexPath) as! JMTitleThreeLabelsSubtitleCell
// Configure cell
let item = data[indexPath.row]
cell.configure(item.caption, unit: item.unit, values: item.values)
cell.accessoryType = .DisclosureIndicator
return cell
} else {
let cell = tableView.dequeueReusableCellWithIdentifier(CellIdentifier.JMBasicCell.rawValue, forIndexPath: indexPath)
// Configure cell
cell.textLabel?.text = NSLocalizedString("noData", comment: "")
cell.selectionStyle = .None
return cell
}
default:
let cell = tableView.dequeueReusableCellWithIdentifier(CellIdentifier.JMBasicCell.rawValue, forIndexPath: indexPath) as! JMDefaultCell
...
return cell
}
}
}
// MARK: - JMVitalSignsViewControllerDelegate
extension JMProfileViewController: JMVitalSignsViewControllerDelegate {
/**
Refresh vital signs
*/
func refreshVitalSigns(selectedItems: [Items]) {
print("Refresh vital signs")
var data: [Items] = []
for item in selectedItems {
for vitalItem in vitalSigns {
if item.match == vitalItem.match {
data.append(vitalItem)
break
}
}
}
self.data = data
// HERE IS MY PROBLEM
// tableView.beginUpdates()
// tableView.reloadSections(NSIndexSet(index: 1), withRowAnimation: .Fade)
// tableView.endUpdates()
tableView.reloadData()
}
}
最佳答案
我终于找到了解决方法。
我将 UIViewController 更改为 UITableViewController 并在具有自动布局的 TableViewHeader(不是节标题)中添加了每个自定义 UIView。
现在可以了!
关于Swift:tableView reloadSections 后不满足约束(自动布局),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38930926/
很好奇,就使用rubyonrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提
我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("
是否可以为特定(或所有)项目使用多个布局?例如,我有几个项目,我想对其应用两种不同的布局。一个是绿色的,一个是蓝色的(但是)。我想将它们编译到我的输出目录中的两个不同文件夹中(例如v1和v2)。我一直在玩弄规则和编译block,但我不知道这是怎么回事。因为,每个项目在编译过程中只编译一次,我不能告诉nanoc第一次用layout1编译,第二次用layout2编译。我试过这样的东西,但它导致输出文件损坏。compile'*'doifitem.binary?#don’tfilterbinaryitemselsefilter:erblayout'layout1'layout'layout2'
我们目前正在为ROR3.2开发自定义cms引擎。在这个过程中,我们希望成为我们的rails应用程序中的一等公民的几个类类型起源,这意味着它们应该驻留在应用程序的app文件夹下,它是插件。目前我们有以下类型:数据源数据类型查看我在app文件夹下创建了多个目录来保存这些:应用/数据源应用/数据类型应用/View更多类型将随之而来,我有点担心应用程序文件夹被这么多目录污染。因此,我想将它们移动到一个子目录/模块中,该子目录/模块包含cms定义的所有类型。所有类都应位于MyCms命名空间内,目录布局应如下所示:应用程序/my_cms/data_source应用程序/my_cms/data_ty
我最喜欢的Google文档功能之一是它会在我工作时不断自动保存我的文档版本。这意味着即使我在进行关键更改之前忘记在某个点进行保存,也很有可能会自动创建一个保存点。至少,我可以将文档恢复到错误更改之前的状态,并从该点继续工作。对于在MacOS(或UNIX)上运行的Ruby编码器,是否有具有等效功能的工具?例如,一个工具会每隔几分钟自动将Gitcheckin我的本地存储库以获取我正在处理的文件。也许我有点偏执,但这点小保险可以让我在日常工作中安心。 最佳答案 虚拟机有些人可能讨厌我对此的回应,但我在编码时经常使用VIM,它具有自动保存功
基本上,我只是试图在满足特定条件时停止程序运行其余行。unlessraw_information.firstputs"Noresultswerereturnedforthatquery"breakend然而,在程序运行之前我得到了这个错误:Invalidbreakcompileerror(SyntaxError)执行此操作的正确方法是什么? 最佳答案 abort("Noresultswerereturnedforthatquery")unlesscondition或unlessconditionabort("Noresultswer
我想知道是否可以通过自动创建数组来插入数组,如果数组不存在的话,就像在PHP中一样:$toto[]='titi';如果尚未定义$toto,它将创建数组并将“titi”压入。如果已经存在,它只会推送。在Ruby中我必须这样做:toto||=[]toto.push('titi')可以一行完成吗?因为如果我有一个循环,它会测试“||=”,除了第一次:Person.all.eachdo|person|toto||=[]#with1billionofperson,thislineisuseless999999999times...toto.push(person.name)你有更好的解决方案吗?
文章目录1.自动驾驶实战:基于Paddle3D的点云障碍物检测1.1环境信息1.2准备点云数据1.3安装Paddle3D1.4模型训练1.5模型评估1.6模型导出1.7模型部署效果附录show_lidar_pred_on_image.py1.自动驾驶实战:基于Paddle3D的点云障碍物检测项目地址——自动驾驶实战:基于Paddle3D的点云障碍物检测课程地址——自动驾驶感知系统揭秘1.1环境信息硬件信息CPU:2核AI加速卡:v100总显存:16GB总内存:16GB总硬盘:100GB环境配置Python:3.7.4框架信息框架版本:PaddlePaddle2.4.0(项目默认框架版本为2.3
我不确定如何为我的搜索功能添加自动完成表单。"get"do%>nil%>我有一个具有自定义操作的Controllerdefquery@users=Search.user(params[:query])@article=Search.article(params[:query])end模型如下:defself.user(search)ifsearchUser.find(:all,:conditions=>['first_nameLIKE?',"%#{search}%"])elseUser.find(:all)endenddefself.article(search)ifsearchArt
我对自动测试的工作方式的印象(基于cucumbergithubwiki和其他在线内容)是它应该重新运行红色示例,直到它们通过。我的问题是它会重新运行规范文件中找到失败示例的所有示例,包括通过的示例。我不想浪费时间在修复失败示例的同时重新运行通过的示例。是否可以配置自动测试以便仅运行失败的示例? 最佳答案 您需要rspec-retrygem。以下是文档中有关如何实现它的一些示例:将它应用到覆盖整个测试套件的configureblock中...RSpec.configuredo|config|config.verbose_retry=t