2016-07-10 4 views
0

i Hinzufügen sind versucht, eine Zeile in einem Tableview auf der Oberseite let indexPath : [NSIndexPath] = [NSIndexPath(forRow: 0, inSection: 0)] parentTableView.insertRowsAtIndexPaths(indexPath, withRowAnimation: .Fade) hinzuzufügen, aber es es auf den Boden des Tablevieweine Zeile in die Spitze eines Tableview

Dies ist mein Code hinzufügen: -

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) { 





} 

}

Antwort

3

Zunächst einmal rufen nie reloadData nach insertRowsAtIndexPaths Aufruf weil insertRowsAtIndexPaths implizit die Tabellenansicht umlagert.

Aber gerade dieser Umstand verdunkelt das eigentliche Problem.

Sie das neue Element anhängen (n) an die Datenquelle Array (n) - übrigens, warum Sie nicht eine benutzerdefinierte Struktur anstelle der drei (bearbeiten verwenden: Es gibt sogar vier!) Arrays - so sind sie physisch am Ende.

insertRowsAtIndexPaths fügt das Element korrekt bei Index 0 ein, aber das nachfolgende Neuladen der Tabellenansicht verschiebt das Element entsprechend dem Datenquellenarray wieder an das Ende der Tabelle.

Lösung: insert die Position (en) bei Index 0 des Datenquellen-Array (s) statt append sie.

bearbeiten

Ein Vorschlag eine benutzerdefinierte Struktur

  • dass

    außerhalb Ihrer View-Controller deklarieren verwenden
    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) 
        } 
    } 
    
  • In ViewController erklären eine Datenquelle Array

    var avatars = [Avatar]() 
    
  • In viewDidLoad bevölkern die Datenquellen-Array

    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() 
    } 
    
  • In numberOfRowsInSection Rückkehr avatars.count

  • In cellForRowAtIndexPath zuzuweisen, die Eigenschaften

    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 
    
  • Ersetzen tableViewConfiguration mit

    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) 
    } 
    
+0

Hey @vadian ich das bin hier, hat es nicht wirklich! .. auch können Sie mich auf eine Dokumentation meine Grundlagen löschen! – Dravidian

+0

Es ist erforderlich, das Modell (Datenquellenarray) und die Ansicht (Tabellenansicht) synchron zu halten. Dies bedeutet, dass Sie ein neues Element genau so in das Datenquellenarray einfügen müssen, wie Sie es in der Tabellenansicht erwarten . Dann lassen Sie die 'reloadData()' Zeile weg und Sie sind fertig. – vadian

+0

Ja, was ich nicht weiß, wie würdest du das in Code machen? ... bin ein Neuling .. – Dravidian