簡體   English   中英

UITableview節?

[英]UITableview Section?

我試圖在tableView中有兩個部分。 我希望將項目添加到第0部分,然后能夠選擇一行以將其從第0部分移動到第1部分。到目前為止,我已經將這些項目添加到了第0部分,但是當消除該數據時,不會加載數據第二個viewController。 我必須更改視圖(點擊添加按鈕和返回按鈕),它最終顯示出來(仍然沒有弄清楚)。 我知道必須通過數組和didSelectRow方法在各節之間移動行,但這使我陷入循環(尤其是coreData)。 是否為第1部分的項目創建第二個數組? TableView數據是從第二個ViewController輸入的,並由NSFetchedResultsController對實體“ SList”進行管理。 我已經在“ SList”下為“ slcross”創建了一個屬性(還包括輸入“ slitem”,“ sldesc”,“ slqty”和“ slprice”,但不知道如何將其從第0部分獲取到第1部分)。 1.或者,我需要為划掉的項目創建第二個實體嗎?對不起,我的頭有些微...

class ShoppingList: UIViewController, NSFetchedResultsControllerDelegate, UITableViewDataSource, UITableViewDelegate {

    let moc = (UIApplication.sharedApplication().delegate as! AppDelegate).managedObjectContext

    var frc : NSFetchedResultsController = NSFetchedResultsController()

    func itemFetchRequest() -> NSFetchRequest{

        let fetchRequest = NSFetchRequest(entityName: "SList")
        let primarySortDescription = NSSortDescriptor(key: "slcross", ascending: true)
        let secondarySortDescription = NSSortDescriptor(key: "slitem", ascending: true)
        fetchRequest.sortDescriptors = [primarySortDescription, secondarySortDescription]
        return fetchRequest
    }

    func getFetchRequetController() ->NSFetchedResultsController{

        frc = NSFetchedResultsController(fetchRequest: itemFetchRequest(), managedObjectContext: moc, sectionNameKeyPath: "slcross", cacheName: nil)
        return frc
    }

    @IBOutlet weak var tableView: UITableView!

    @IBAction func AddNew(sender: AnyObject) {

        frc = getFetchRequetController()
        frc.delegate = self

        do {
            try frc.performFetch()
        } catch _ {
            print("Failed to perform inital fetch.")
            return
        }
        self.tableView.reloadData()
    }

    override func viewDidLoad() {

        super.viewDidLoad()


        frc = getFetchRequetController()
        frc.delegate = self

        do {
            try frc.performFetch()
        } catch _ {
            print("Failed to perform inital fetch.")
            return
        }

        self.tableView.reloadData()

        //TableView Background Color
        self.tableView.backgroundColor = UIColor.clearColor()
        self.tableView.separatorColor = UIColor.blackColor()
        tableView.reloadData()

    override func viewDidDisappear(animated: Bool) {

        frc = getFetchRequetController()
        frc.delegate = self

        do {
            try frc.performFetch()
        } catch _ {
            print("Failed to perform inital fetch.")
            return
        }
        self.tableView.reloadData()
    }

    //tableView Data
    func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {
        let managedObject:NSManagedObject = frc.objectAtIndexPath(indexPath) as! NSManagedObject
        moc.deleteObject(managedObject)
        do {
            try moc.save()
        } catch _ {
            print("Failed to save.")
            return
        }
    }

    func numberOfSectionsInTableView(tableView: UITableView) -> Int {

        let numberOfSections = frc.sections?.count
        return numberOfSections!
    }

    func tableView(tableView: UITableView, titleForHeaderInSection section: Int) -> String?{
        let sectionHeader = "Items - #\(frc.sections![section].numberOfObjects)"
        let sectionHeader1 = "Crossed Off Items - #\(frc.sections![section].numberOfObjects)"
        if (section == 0) {
            return sectionHeader
        }
        if (section == 1){
            return sectionHeader1
        }else{
            return nil
        }
    }

    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        let numberOfRowsInSection = frc.sections?[section].numberOfObjects
        return numberOfRowsInSection!
    }

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath)
        let items = frc.objectAtIndexPath(indexPath) as! SList
        cell.backgroundColor = UIColor.clearColor()
        cell.textLabel?.text = "\(items.slitem!) - Qty: \(items.slqty!)"
        cell.textLabel?.font = UIFont.systemFontOfSize(23)


        return cell
    }
    //end tablevViewData*/


    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }


    func controllerDidChangeContent(controller: NSFetchedResultsController) {
        tableView.reloadData()
    }

    //segue to add/edit
    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject!) {

        if segue.identifier == "edit" {

            let cell = sender as! UITableViewCell
            let indexPath = tableView.indexPathForCell(cell)
            let SListController:SLEdit = segue.destinationViewController as! SLEdit
            let items:SList = frc.objectAtIndexPath(indexPath!) as! SList
            SListController.item = items
        }
    }
}

第二個ViewController

class SLEdit: UIViewController {

    let moc = (UIApplication.sharedApplication().delegate as! AppDelegate).managedObjectContext


    @IBOutlet weak var slitem: UITextField!
    @IBOutlet weak var sldesc: UITextField!
    @IBOutlet weak var slqty: UITextField!
    @IBOutlet weak var slprice: UITextField!

    var item: SList? = nil


    override func viewDidLoad() {
        super.viewDidLoad()

        if item != nil{
            slitem.text = item?.slitem
            sldesc.text = item?.sldesc
            slqty.text = item?.slqty
            slprice.text = item?.slprice
        }

        // "x" Delete Feature
        self.slitem.clearButtonMode = UITextFieldViewMode.WhileEditing
        self.sldesc.clearButtonMode = UITextFieldViewMode.WhileEditing
        self.slqty.clearButtonMode = UITextFieldViewMode.WhileEditing
        self.slprice.clearButtonMode = UITextFieldViewMode.WhileEditing
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }

    func dismissVC() {
        navigationController?.popViewControllerAnimated(true)
    }


    // Dispose of any resources that can be recreated.


    @IBAction func saveButton(sender: AnyObject) {

        if item != nil {
            edititems()
        } else {
            createitems()
        }

        dismissVC()
    }

    func createitems() {

        let entityDescription = NSEntityDescription.entityForName("SList", inManagedObjectContext: moc)

        let item = SList(entity: entityDescription!, insertIntoManagedObjectContext: moc)

        item.slitem = slitem.text
        item.sldesc = sldesc.text
        item.slqty = slqty.text
        item.slprice = slprice.text

        if slitem.text == nil{
            createitems()

        }else{
            edititems()
        }

        do {
            try moc.save()
        } catch _ {
            return
        }
    }

    func edititems() {
        item?.slitem = slitem.text!
        item?.sldesc = sldesc.text!
        item?.slqty = slqty.text!
        item?.slprice = slprice.text!

        do {
            try moc.save()
        } catch {
            return
        }
    }
}

我只是在學習和自學,所以如果您可以給我展示和解釋它,以便我理解我將不勝感激!

...關閉第二個viewController時不會加載數據...

我無法立即知道為什么會這樣。 我建議使用斷點和/或print()嘗試對其進行調試。 我希望表格視圖由FRC在controllerDidChangeContent委托方法中自動更新,因此首先將

print("Controller didChangeContent reloaded the tableView")

在該方法中查看創建或編輯項目后它是否出現在日志中。 對於AddNew IBAction方法和viewDidDisappear同樣如此。

...我是否為第1節的項目創建了第二個數組...

沒必要。 FRC應該為您管理這些部分和項目:假設slcross是布爾屬性,FRC將分析SLItem對象,如果slcross為false,則將它們正確分配給第0部分,如果為true,則將它們正確分配給第1部分。 (用於在FRC中“查找”對象的indexPath ,例如

let items = frc.objectAtIndexPath(indexPath) as! SList

同時包含該部分和該行)。

...如何從第0部分到第1部分...

為了確保在首次創建時正確分配項目,請添加:

item.slcross = false

createItems()方法。 要將項目從第0部分移至第1部分,請將此值更改為didSelectRowAtIndexPath如您所說, didSelectRowAtIndexPath可能是執行此操作的好地方:

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    let items = frc.objectAtIndexPath(indexPath) as! SList
    items.slcross = true
}

...我需要為划掉的項目創建第二個實體嗎?

不需要,FRC應該做必要的事情。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM