ios - 在 tableView 的顶部添加一行

标签 ios uitableview swift2 xcode7

我正在尝试在顶部的 tableView 中添加一行 let indexPath : [NSIndexPath] = [NSIndexPath(forRow: 0, inSection: 0)] parentTableView.insertRowsAtIndexPaths(indexPath, withRowAnimation: .Fade) 但是它将它添加到 tableView 的底部

这是我的代码:-

import UIKit

class ViewController: UIViewController , UITableViewDelegate, UITableViewDataSource,transferDelegate , UIViewControllerTransitioningDelegate{

var xibName : String = "HomepageFeedCellHeader"


var lords : [String] = ["name1","name2","name3"]

var queens : [String] = ["--","q1","q2"]

var desc : [String] = ["alpha","beta","gamma"]

var  menProfilePictures : [UIImage] = [UIImage(named: "DaarioNaharis")!,UIImage(named: "JaimeLannister")!,UIImage(named: "LordVarys")!]

@IBOutlet weak var postButton: UIButton!

@IBOutlet weak var parentTableView: UITableView!

@IBOutlet weak var pickImages: UIButton!

var a : ParentTableViewCell = ParentTableViewCell()

@IBOutlet weak var postTextView: UITextView!





override func viewDidLoad() {

    super.viewDidLoad()



    parentTableView.delegate = self
    parentTableView.dataSource = self


}




func numberOfSectionsInTableView(tableView: UITableView) -> Int {
    return 1
}




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



func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

    let cell = parentTableView.dequeueReusableCellWithIdentifier("ParentCell", forIndexPath: indexPath) as! ParentTableViewCell


    cell.transferingDelegate = self


    cell.feedPostUsername.text = lords[indexPath.row]
    cell.feedPostUserDetails.text = queens[indexPath.row]
    cell.feedPostDescription.text = desc[indexPath.row]
    cell.feedUserProfilePictures.image = menProfilePictures[indexPath.row]
    cell.selectionStyle = .None


    return cell


}

func transfer(itemNo : Int) {

    print("call recieved in viewController from item \(itemNo)")

    let imagePopOverScene = self.navigationController?.storyboard?.instantiateViewControllerWithIdentifier("ImagePopOverViewControllerVC_ID") as? ImagePopOverViewController

    print("itemNo in viewControlle \(itemNo)")
    if itemNo < 3{

        imagePopOverScene?.setImage = menProfilePictures[itemNo]

    }else{

        imagePopOverScene?.setImage = UIImage(named: "defaultProfilePic")

    }

    imagePopOverScene?.transitioningDelegate = self

    self.navigationController?.pushViewController(imagePopOverScene!, animated: true)

}

@IBAction func postBtnAction(sender: UIButton) {

    print("post btn action recieved")
    tableViewConfiguration()

}

func tableViewConfiguration(){



    parentTableView.beginUpdates()

    desc.append(postTextView.text!)
    menProfilePictures.append(UIImage(named: "defaultProfilePic")!)
    queens.append("--")
    lords.append("Anonymous")

    let indexPath : [NSIndexPath] = [NSIndexPath(forRow: 0, inSection: 0)]
    print(indexPath)
    parentTableView.insertRowsAtIndexPaths(indexPath, withRowAnimation: .Fade)

    tableView(parentTableView, cellForRowAtIndexPath: indexPath[0])

    parentTableView.endUpdates()
    parentTableView.reloadData()

    parentTableView.scrollToRowAtIndexPath(indexPath[0], atScrollPosition: UITableViewScrollPosition.Top, animated: true)


}


@IBAction func pickImagesAction(sender: UIButton) {





}

最佳答案

首先,永远不要调用reloadData打电话后 insertRowsAtIndexPaths因为insertRowsAtIndexPaths隐式重新排 ListView 。

但这种情况掩盖了实际问题。

您正在将新项目附加到数据源数组 - 顺便说一句,您为什么不使用自定义结构而不是三个(编辑:那里甚至是四个!)数组——所以它们在最后物理上

insertRowsAtIndexPaths在索引 0 处正确插入项目,但随后重新加载 TableView 将项目根据数据源数组再次移动到表的末尾。

解决方案:insert数据源数组索引 0 处的项目,而不是 append他们。

编辑

使用自定义结构的建议

  • 在你的 View Controller 之外声明

    struct Avatar {
    
      let lord : String
      let queen : String
      let desc : String
      let profileImage : UIImage?
    
      init(lord: String, queen: String, desc: String, imageName: String) {
        self.lord = lord
        self.queen = queen
        self.desc = desc
        self.profileImage = UIImage(named: imageName)
      }
    }
    
  • ViewController声明一个数据源数组

    var avatars = [Avatar]()
    
  • viewDidLoad填充数据源数组

    override func viewDidLoad() {
        super.viewDidLoad()
        parentTableView.delegate = self
        parentTableView.dataSource = self
    
        avatars = [Avatar(lord: "name1", queen: "--", desc: "alpha", imageName: "DaarioNaharis"),
                   Avatar(lord: "name2", queen: "q1", desc: "beta", imageName: "JaimeLannister"),
                   Avatar(lord: "name3", queen: "q2", desc: "gamma", imageName: "LordVarys")]
        parentTableView.reloadData()
     }
    
  • numberOfRowsInSection返回 avatars.count

  • cellForRowAtIndexPath分配属性

    let avatar = avatars[indexPath.row]
    cell.feedPostUsername.text = avatar.lord
    cell.feedPostUserDetails.text = avatar.queen
    cell.feedPostDescription.text = avatar.desc
    cell.feedUserProfilePictures.image = avatar.profileImage
    
  • 替换tableViewConfiguration

    func tableViewConfiguration(){
        let newAvatar = Avatar(lord: "Anonymous", queen: "--", desc: postTextView.text!, imageName: "defaultProfilePic"
        avatars.insert(newAvatar, atIndex: 0)
        let indexPath = NSIndexPath(forRow: 0, inSection: 0)
        print(indexPath)
        parentTableView.insertRowsAtIndexPaths([indexPath], withRowAnimation: .Fade)
        parentTableView.scrollToRowAtIndexPath(indexPath, atScrollPosition: .Top, animated: true)
    }
    

关于ios - 在 tableView 的顶部添加一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38290316/

相关文章:

ios - 检测是否在越狱的 iDevice 中安装/卸载了另一个应用程序

iphone - Assets 目录 ImageSet - 编辑 Contents.json

ios - Swift2 - 如何确定抛出错误的类型?

ios - Swift 2.1 - 错误处理 - 未编译多个 Catch

ios - 如何加粗 NSString 中一个字符的多个实例?

objective-c - 从 xcode 中删除 "Format String is not a string literal"警告

ios - 剪辑/控制表格 View 的滚动

iphone - 在模型类中重新加载表

ios - UITableView后台查看平移手势

ios - Swift 2 OAuth2 领英连接