表视图重叠细胞swift2

时间:2015-10-29 12:07:29

标签: ios uitableview uitextview swift2 ios9

我的应用中有 tableview 。它位于我的拆分视图详细信息视图中。每当我使用UItextviews填充 tableview 时,单元格似乎彼此重叠。这不是我想要的。有没有人有任何建议来解决这个问题?

Screen shot of problem

这是我的vc代码:

  import UIKit

class DetailViewController: UIViewController, UITableViewDelegate, UITextViewDelegate {

@IBOutlet weak var messagesTableView: UITableView!
var initVar = 0

var row: Int?

var firstLoad = true

var detailItem = {}
var convo = ["hello", "hellohello", "hellohellohellohello", "hellohellohellohellohellohellohellohello", "hellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohello", "hellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohello", "hellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohello", "hellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohello", "hellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohello", "hellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohellohello"]

override func viewDidLoad() {
    super.viewDidLoad()

    // Uncomment the following line to preserve selection between presentations
    // self.clearsSelectionOnViewWillAppear = false

    // Uncomment the following line to display an Edit button in the navigation bar for this view controller.
    // self.navigationItem.rightBarButtonItem = self.editButtonItem()
    print("hello")
    messagesTableView.separatorColor = UIColor.whiteColor()

    print(row)
    messagesTableView.reloadData()
    print(firstLoad)

    let numberOfSections = messagesTableView.numberOfSections
    let numberOfRows = messagesTableView.numberOfRowsInSection(numberOfSections-1)

    if numberOfRows > 0 {
        print(numberOfSections)
        let indexPath = NSIndexPath(forRow: numberOfRows-1, inSection: (numberOfSections-1))
        messagesTableView.scrollToRowAtIndexPath(indexPath, atScrollPosition: UITableViewScrollPosition.Bottom, animated: false)
    }
    messagesTableView.reloadData()
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

// MARK: - Table view data source

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return convo.count
}

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCellWithIdentifier("detailCell", forIndexPath: indexPath)

    var textView = UITextView()

    textView.delegate = self
    textView.editable = false
    textView.text = convo[indexPath.row]
    textView.textAlignment = .Center
    textView.sizeToFit()

    if indexPath.row % 2 == 0 {
        textView = UITextView(frame: CGRect(x: cell.frame.width * (2/5), y: 4, width: cell.frame.width * (3/5), height: cell.frame.height))
        textView.backgroundColor = UIColor.blueColor()
    } else {
        textView = UITextView(frame: CGRect(x: 0, y: 4, width: cell.frame.width * (3/5), height: cell.frame.height))
        textView.backgroundColor = UIColor.greenColor()
    }

    textView.textColor = UIColor.whiteColor()

    textView.delegate = self
    textView.editable = false
    textView.text = convo[indexPath.row]
    textView.textAlignment = .Center
    textView.sizeToFit()
    tableView.rowHeight = textView.frame.height + 7
    cell.addSubview(textView)


    return cell
}
}

1 个答案:

答案 0 :(得分:1)

正在UITableView重新使用这些单元格。

您正在添加TextView,因此每次重复使用时都会继续添加TextView。

您的代码应该被修改,以便TextView只被添加 IF 它不存在于单元格中。

最简单的方法是在TextView中添加TAG(唯一),然后如果View from Tag为nil(AKA不存在)添加它,或者从ViewFromTag中获取

至于一个例子,虽然我仍在使用obj-c并考虑到这一点,但我的代码可能有错误,这里是代码:

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCellWithIdentifier("detailCell", forIndexPath: indexPath)

        var textView: UITextView

        if (cell.viewWithTag(10000) != nil) {
            textView = (cell.viewWithTag(10000) as? UITextView)!
        }
        else {
            textView  = UITextView()
            textView.tag = 10000
            textView.delegate = self
            textView.editable = false
            textView.textAlignment = .Center
            cell.addSubview(textView)
        }

        textView.text = convo[indexPath.row]

        if indexPath.row % 2 == 0 {
            textView.frame = CGRectMake(cell.frame.width * (2/5) , 4, cell.frame.width * (3/5), cell.frame.height)
            textView.backgroundColor = UIColor.blueColor()
        } else {
            textView.frame = CGRectMake(0 , 4, cell.frame.width * (3/5), cell.frame.height)
            textView.backgroundColor = UIColor.greenColor()
        }

        textView.sizeToFit()
        tableView.rowHeight = textView.frame.height + 7

        return cell
    }

解释代码,正如您所理解的那样:

UITableView正在重复使用单元格。 这意味着,每当单元格移动到屏幕的可见部分之外时,它就会被重复使用(原样),并显示为TableView的新单元格。

原因在于记忆效率。 所以想象一下1000行的UITableView。如果为每一行创建了一个新单元格,我们将不得不为每个单元格分配内存。

但在典型应用中,通常每次只能看到几个细胞(通常少于10个)。 所以这里的诀窍是我们只需要创建那么多单元格。 一旦单元格消失,它就会被用作TableView的新单元格。

因此,如果每次调用UITextView委托方法时添加tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell,并且重新使用该单元格,则最终会将UITextViews添加到已有单元格的单元格中。所以你最终得到了你所展示的问题。

我提供的代码做了两件事:

  1. UITextView添加到单元格(textView.tag = 10000
  2. 时,会为UITextView指定一个唯一的标记号
  3. 检查是否已将UITextView添加到单元格中,如果已添加if (cell.viewWithTag(10000) != nil),我们会使用$this->helper('catalogsearch')->getQuery()->getResultCollection(); ,我们不会再次添加$query
相关问题