ios - 表格单元格未加载到滚动条上

标签 ios swift uitableview

我正在我的应用程序中创建一个消息传递页面,但我遇到了一些严重的问题。当页面第一次加载时它看起来不错,但是当你开始向下滚动时,一切都变得一团糟。新单元格不会加载,然后当我向上滚动时,大多数单元格都消失了,除了通常显示的 1 并且它在错误的位置。

正在进行一些异步操作。发送消息时,它会发送到服务器,然后当它返回时,我重新加载数据并滚动到底部新输入的消息。这也很麻烦。大多数情况下,发送消息时新单元格不会出现。然后再发送 1 或 2 个后就会全部显示出来。

这是我的 ViewController,它也是我的数据源和委托(delegate)

import UIKit


class MessageDetailController:  UIViewController,UITableViewDataSource,UITableViewDelegate, UITextFieldDelegate {


@IBOutlet weak var lblMessageText: UITextField!
@IBOutlet weak var sendViewHeightConstraint: NSLayoutConstraint!
@IBOutlet weak var messagesTable: UITableView!
@IBOutlet weak var sendMsgView: UIView!
@IBOutlet weak var sendMessageView: UIView!
var messageDetailArray = [Message]()


override func viewDidLoad() {
    super.viewDidLoad()
        self.lblMessageText.delegate = self
        self.view.bringSubviewToFront(self.sendMessageView)
        self.messagesTable.separatorStyle = UITableViewCellSeparatorStyle.None
        self.messagesTable.dataSource = self
        self.messagesTable.delegate = self

        self.messagesTable.reloadData()
}

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

func textFieldShouldReturn(textField: UITextField) -> Bool {
    _ = MessageService().sendMessage("James", message: lblMessageText.text!, callback: loadMessages)
    lblMessageText.text = ""
    return true
}

func loadMessages(jsonData:NSArray){
    dispatch_async(dispatch_get_main_queue(),{
        var messages = [Message]()
        for messageTest in jsonData {
            if let message = messageTest as? NSDictionary {
                messages.append(Message(messageType:Message.QA.A, from:message["user_display_label"] as! String, messageText:message["message"] as! String, timeSent:NSDate()))
            }
        }


        self.messageDetailArray = messages;
        self.messagesTable.reloadData()
        self.messagesTable.scrollToRowAtIndexPath(NSIndexPath(forRow: self.messageDetailArray.count - 1, inSection: 0), atScrollPosition: UITableViewScrollPosition.Bottom, animated: true)

    })
}


@IBAction func endedEditing(sender: AnyObject) {

    self.view.layoutIfNeeded()
    UIView.animateWithDuration(0.2, animations: {
        self.sendViewHeightConstraint.constant = 40
        self.view.layoutIfNeeded()
        }, completion: nil)
}



@IBAction func startedEditing(sender: AnyObject) {

    self.view.layoutIfNeeded()
    UIView.animateWithDuration(0.2, animations: {
        self.sendViewHeightConstraint.constant = 295
        self.view.layoutIfNeeded()
        }, completion: nil)

}

@IBAction func sendMessage(sender: AnyObject) {

    _ = MessageService().sendMessage("James", message: lblMessageText.text!, callback: loadMessages)
    lblMessageText.text = ""


}


func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
    let thisMsg = messageDetailArray[indexPath.row]
    let cell: MessageDetailATableViewCell = tableView.dequeueReusableCellWithIdentifier("messageCenterA", forIndexPath: indexPath) as! MessageDetailATableViewCell


    cell.msgLabel?.text = thisMsg.messageText;
    cell.msgLabel.sizeToFit()
    cell.msgLabel.numberOfLines = 0

    cell.frame = CGRectMake(0,
        0,
        self.view.bounds.width,
        cell.frame.size.height);

    let myInsets = UIEdgeInsetsMake(7, 8, 7, 8)
    let bubbleImage = UIImage(named: "balloon_read_right")?.resizableImageWithCapInsets(myInsets)

    let bubbleImageView = UIImageView(image: bubbleImage)

    bubbleImageView.frame = CGRectMake(0, 0, cell.bubbleView.bounds.width, cell.bubbleView.bounds.height)

    cell.bubbleView.addSubview(bubbleImageView)
    cell.bubbleView.bringSubviewToFront(cell.msgLabel)


    return cell

}


func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
    let messageSize:CGSize = PTSMessagingCell.messageSize(messageDetailArray[indexPath.row].messageText)
    return messageSize.height + 2 * PTSMessagingCell.textMarginVertical() + 40
}
}

如果您仔细阅读,您会注意到我使用了这个类,所以我会为您包含它。它只是一个表格单元,并没有做太多事情。

import UIKit

class MessageDetailATableViewCell: UITableViewCell {
@IBOutlet weak var bubbleView: UIView!
@IBOutlet weak var msgImageView: UIImageView!
@IBOutlet weak var msgLabel: UILabel!


override func awakeFromNib() {
    super.awakeFromNib()
    // Initialization code

}

override func setSelected(selected: Bool, animated: Bool) {
    super.setSelected(selected, animated: animated)

    // Configure the view for the selected state
}

}

为了让它正常工作,我对这段代码进行了多次修改,但我发现其他人也有同样的错误。任何帮助将不胜感激!

谢谢!!

最佳答案

问题是由您设置单元格的 frame 引起的。您将所有单元格的原点设置为 (0,0)。这会破坏 TableView 的布局。切勿从外部触摸电池的边框。

如果您想设置单元格的高度,您必须在 UITableViewDelegate 方法 tableView(_:heightForRowAtIndexPath:) 中进行设置。计算那里的单元格高度并将其返回。

您不必设置单元格的宽度,因为在 UITableView 中,UITableViewCells 始终与 UITableView 具有相同的宽度.

关于ios - 表格单元格未加载到滚动条上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33375144/

相关文章:

ios - 如何在uitableviewcell swift上使用pushviewcontroller

ios - 在 iOS 上检查位置服务权限

swift - NSUserDefaults 改变每个 segue

php - 如何在 iOS Swift 3 中像 laravel encrypt() 方法一样加密 AES 256 CBC

swift - tableviewcell 按钮中的弹出框位置不正确

iphone - 获取经过验证的商家paypal邮箱ID

iphone - 设备功能编程指南去了哪里?

ios - iOS 虚拟文件系统

c# - 应用打开时的调用方法

uitableview - 在 Custom UITableViewCell iOS 5 上将背景设置为透明不起作用,所有技巧均无效