如何调整表格视图的大小,如果有任何数据并且表格视图中没有数据

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 用于包含您的 UITextFieldPlusUIButton 的静态单元格。 所以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。 使用&gt;=0UITextFieldUITableView 的前导、尾随、固定高度、顶部和底部间距添加到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,在 numberOfRowsrowHeight 的变量中,我可以设置任何值??

以上是关于如何调整表格视图的大小,如果有任何数据并且表格视图中没有数据的主要内容,如果未能解决你的问题,请参考以下文章

自动调整大小(动态高度)表格视图单元格的问题

ios在表格视图单元格中视觉调整图像大小

调整单元格大小时如何使表格视图动画平滑

我可以使用情节提要根据屏幕尺寸调整静态表格视图的大小吗?

如何使用自动布局来调整表格视图单元格中的视图大小?

如何动态调整拆分或表格视图控制器的大小?