如何调整表格视图的大小,如果有任何数据并且表格视图中没有数据
Posted
技术标签:
【中文标题】如何调整表格视图的大小,如果有任何数据并且表格视图中没有数据【英文标题】:How to resize table view, when if any data is there and no data in table view 【发布时间】:2016-12-07 05:37:24 【问题描述】:我有一个标题为“当前团队”的屏幕,在该屏幕下方有一个表格视图,在该文本字段下方有一个 + 按钮。因此,当用户在 UITextField 中输入任何数据时,如果用户按下 + 按钮,该数据将添加到 UITableView 上方
这个打击图像是我当前的屏幕:
现在,我为上面的屏幕设计并添加了一些约束。现在当表格视图中没有数据且至少有一个数据时,标题和文本字段之间有更多的空间。
但我需要的是:
我需要如下图所示:
我不需要在标题和文本字段之间显示空格。并且当表格视图中至少有一个数据时,表格视图的高度应该增加并且文本字段也应该低于。
我该如何处理:
我确实喜欢这样:
if currentTeams.visibleCells.count == 0
tableViewHeight.constant = 5
else
tableViewHeight.constant = 50
当前团队 = 表视图名称
但它工作正常,请帮帮我。我该怎么做?
代码片段:
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int
if tableView.isEqual(currentTeams)
return teamNames.count
return pastTeamNames.count
func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat
return 20
func numberOfSectionsInTableView(tableView: UITableView) -> Int
return 1
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
if tableView.isEqual(currentTeams)
return getCellForRow(indexPath)
return getCellForPastTeamsRow(indexPath)
【问题讨论】:
你试过了吗,self.view.setNeedsLayout() 我是处理 ios 的新手,通过查看一些教程,我设置了一些高度限制并尝试了。但我可以尝试任何其他的 if currentTeams.visibleCells.count == 0 tableViewHeight.constant = 5 self.view.setNeedsLayout() else tableViewHeight.constant = 50 self.view.setNeedsLayout() 您可以将footerView
添加到您的tableView 并将textFieldView
添加到您的footerView
? .这样你就不需要更改row height
或任何东西。在Swift3
中测试的代码及其工作。
@Joe 你有这个footerview 的教程吗??
【参考方案1】:
// your table hight constrain.
@IBOutlet var current_team_tablehight: NSLayoutConstraint!
@IBOutlet var playpast_role_table_hight: NSLayoutConstraint!
@IBOutlet var past_team_table_hight: NSLayoutConstraint!
@IBOutlet var certificate_table_hight: NSLayoutConstraint!
override func viewDidLoad()
super.viewDidLoad()
// put it as 0 for default
current_team_tablehight.constant = 0
certificate_table_hight.constant = 0
past_team_table_hight.constant = 0
playpast_role_table_hight.constant = 0
override func viewDidAppear(animated: Bool)
super.viewDidAppear(true)
if profileData.FirstName.length > 0
// data available for that table then .
currentTeams.reloadData()
current_team_tablehight.constant = currentTeams.contentSize.height + 5;
pastTeams.reloadData()
past_team_table_hight.constant = pastTeams.contentSize.height + 5;
playedTableView.reloadData()
playpast_role_table_hight.constant = playedTableView.contentSize.height + 5;
certificationtableview.reloadData()
certificate_table_hight.constant = certificationtableview.contentSize.height + 5;
func deleteTeamFromCurrentTeams(sender: UIButton)
let but = sender
let view = but.superview!
let cell = view.superview as! CurrentTeamsTableViewCell
if let tblView = cell.superview?.superview as? UITableView
if tblView.isEqual(self.currentTeams)
let indexPath = currentTeams.indexPathForCell(cell)
teamNames.removeAtIndex((indexPath?.row)!)
currentTeams.reloadData()
if teamNames.count > 0
current_team_tablehight.constant = currentTeams.contentSize.height;
else
current_team_tablehight.constant = 0;
else if tblView.isEqual(self.pastTeams)
let indexPath = pastTeams.indexPathForCell(cell)
pastTeamNames.removeAtIndex((indexPath?.row)!)
pastTeams.reloadData()
if pastTeamNames.count > 0
past_team_table_hight.constant = pastTeams.contentSize.height;
else
past_team_table_hight.constant = 0;
else if tblView.isEqual(self.playedTableView)
let indexPath = playedTableView.indexPathForCell(cell)
playedTeamNames.removeAtIndex((indexPath?.row)!)
playedTableView.reloadData()
if playedTeamNames.count > 0
playpast_role_table_hight.constant = playedTableView.contentSize.height;
else
playpast_role_table_hight.constant = 0;
else
let indexPath = certificationtableview.indexPathForCell(cell)
ExpTeamNames.removeAtIndex((indexPath?.row)!)
certificationtableview.reloadData()
if ExpTeamNames.count > 0
certificate_table_hight.constant = certificationtableview.contentSize.height;
else
certificate_table_hight.constant = 0;
self.view .layoutIfNeeded()
self.view .setNeedsLayout()
@IBAction func addPastTeamsPressed(sender: AnyObject)
if pastTeamName.text?.trimWhiteSpace != "" && pastTeamName.text?.trimWhiteSpace != "-"
pastTeamNames.append(pastTeamName.textVal)
pastTeamName.text = ""
pastTeams.reloadData()
past_team_table_hight.constant = pastTeams.contentSize.height + 5;
@IBAction func addTeamsPressed(sender: AnyObject)
if teamName.text?.trimWhiteSpace != "" && teamName.text?.trimWhiteSpace != "-"
teamNames.append(teamName.textVal)
teamName.text = ""
currentTeams.reloadData()
current_team_tablehight.constant = currentTeams.contentSize.height + 5;
// for played role
@IBAction func addPlayedTeamsPressed(sender: AnyObject)
if playedTeam.text?.trimWhiteSpace != "" && playedTeam.text?.trimWhiteSpace != "-"
playedTeamNames.append(playedTeam.textVal)
playedTeam.text = ""
playedTableView.reloadData()
playpast_role_table_hight.constant = playedTableView.contentSize.height + 5;
@IBAction func addcertificatecoursePressed(sender: AnyObject)
if Experience.text?.trimWhiteSpace != "" && Experience.text?.trimWhiteSpace != "-"
ExpTeamNames.append(Experience.textVal)
Experience.text = ""
certificationtableview.reloadData()
certificate_table_hight.constant = certificationtableview.contentSize.height + 5;
输出:
【讨论】:
【参考方案2】:你可以通过在你的桌子上使用 fix UITableviewCell 来达到同样的效果。如果您最初没有数据,那么在numberOfRowsInSection
方法return 1
。
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
return (<Your Array>.count > 1) ? <Your Array>.count + 1 : 1;
此 1 用于包含您的 UITextField
和 Plus 的 UIButton
的静态单元格。
所以cellForRow
方法将是
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
if (<Your Array>.count > 1)
if (indexPath.row < <Your Array>.count - 1)
// Initialize your UITableview cell which you have design to show your list
// Your Code to show the list.
// return your cell
if (indexPath.row==<Your Array>.count-1 )
// Initialize and return the cell which you have design using UITextField and "Plus" Button
else
// Initialize and return the cell which you have design using UITextField and "Plus" Button
您的设计将类似于
您也可以查看示例From Github Here。
【讨论】:
我怎样才能修复合适的视图单元格,你能给我一些代码片段吗?我是处理 ios 的新手。因此,如果我看到一些代码,那将对我有帮助 附上我的表格视图委托方法供您参考 @呃。 Vihar Shah 当然, 兄弟我试过了,但我无法实现。我过去 3 个小时是 dtruk,如果可能的话,我应该把我的项目寄给你。你能帮我做一个屏幕吗,这样我就可以理解流程,我会为我的所有屏幕实现 电子邮件 ID:vihar.rahatech@gmail.com。将您的代码邮寄给我。我会在下班后处理这个问题,然后我会把工作副本寄回给你。【参考方案3】:您可以通过将 tableView 行高设置为 UITableViewAutomaticDimension 来获得动态单元格高度。并且您还需要提供估计的高度。所以在你的 viewdidload 中添加这个代码:
tableView.rowHeight = UITableViewAutomaticDimension
tableView.estimatedRowHeight = 140 // or your estimated height
然后在表格视图单元格中使用自动布局来调整项目和容器高度
【讨论】:
因此通过此代码将有助于该表格视图单元格调整项目if currentTeams.visibleCells.count == 0 tableViewHeight.constant = 5 else tableViewHeight.constant = 50
@mack 通过此代码告诉 tableview 您希望自动布局设置单元格的高度。然后你使用自动布局来设置高度。你可以在这里找到一个很好的教程link【参考方案4】:
像这样设置你的约束-
首先,您应该有一个UILabel
表示“当前团队”,并带有超级视图的前导、尾随和顶部约束。
在UILabel
的下方添加UITableView
的前导、尾随和顶部,并使用优先级为250 的固定高度,最初将其设置为0。
使用>=0
将UITextField
与UITableView
的前导、尾随、固定高度、顶部和底部间距添加到superView
这将使UITextField
始终粘在UITableView
的底部。
在您的UIViewController
中为UITableView
高度约束创建一个出口。
现在,如果您可以使用默认的UITableViewCell
高度,那么您的工作会更容易,否则您将不得不计算每个字符串在单元格内的高度并获得该值。在您的 viewDidLoad
中,将 UITableView
高度约束更新为 -
//do this after you do the insertion into the tableview
tableViewHeightConstraint.constant = numberOfRows * rowHeight
view.layoutIfNeeded()
每次在UITableView
中添加或删除一行时,您都必须更新此高度。一旦你的单元格占据了整个屏幕,高度限制就会被打破,UITextField
将卡在底部,你的UITableView
将变得可滚动。
编辑:一旦高度限制中断并且UITableView
停止占据整个屏幕,您必须以编程方式重新添加高度限制。
【讨论】:
tableViewHeightConstraint.constant = numberOfRows * rowHeight
对行数 * 行高抛出一些错误。那是什么??
它们基本上是变量。 numberOfRows
将是要显示的行数,rowHeight
是每行的高度!如果您没有为它们分配正确的值并按照我解释的方式设置约束,这将不起作用!
我的默认行高 = 50,在 numberOfRows
和 rowHeight
的变量中,我可以设置任何值??以上是关于如何调整表格视图的大小,如果有任何数据并且表格视图中没有数据的主要内容,如果未能解决你的问题,请参考以下文章