【问题标题】:UITableview Section?UITableview 部分?
【发布时间】:2015-12-14 01:51:08
【问题描述】:

我试图在我的 tableView 中有两个部分。我希望将项目添加到第 0 节,然后能够选择一行以将其从第 0 节移动到第 1 节。到目前为止,我已将项目添加到第 0 节,但是当它关​​闭时数据不会加载第二个视图控制器。我必须更改视图(点击添加按钮和后退按钮),它最终显示出来(仍然没有弄清楚)。我知道跨部分移动行必须通过数组和 didSelectRow 方法完成,但它让我陷入循环(尤其是使用 coreData)。我是否为第 1 节项目创建第二个数组? TableView 数据从第二个 ViewController 输入并由实体“SList”的 NSFetchedResultsController 管理。我在“SList”下为“slcross”创建了一个属性(还包括输入“slitem”、“sldesc”、“slqty”和“slprice”,但不知道如何从第 0 部分获取到部分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
        }
    }
}

第二个视图控制器

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
        }
    }
}

我只是在自学和自学,所以如果你能告诉我并解释它以便我能理解,我将不胜感激!

【问题讨论】:

    标签: ios uitableview core-data


    【解决方案1】:

    ...当它关闭第二个 viewController 时,数据不会加载...

    我不能立即明白为什么会这样。我建议使用断点和/或print() 来尝试调试它。我希望 FRC 在 controllerDidChangeContent 委托方法中自动更新表格视图,所以先放

    print("Controller didChangeContent reloaded the tableView")
    

    在该方法中查看它是否在您创建/编辑项目后出现在日志中。 AddNew IBAction 方法和viewDidDisappear 也是如此。

    ...我是否要为第 1 部分的项目创建第二个数组...

    不需要。 FRC 应该为您管理部分和项目:假设 slcross 是一个布尔属性,如果 slcross 为假,FRC 将分析 SLItem 对象并将它们正确分配到第 0 部分,如果为真,则将它们正确分配到第 1 部分. (indexPath 用于在 FRC 中“查找”对象,例如

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

    包括部分和行)。

    ...如何从第 0 节到第 1 节...

    为确保项目在首次创建时正确分配,添加:

    item.slcross = false
    

    createItems() 方法。要将项目从第 0 节移动到第 1 节,请将此值更改为 true - 正如您所说,didSelectRowAtIndexPath 可能是这样做的好地方:

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

    ...我需要为划掉的项目创建第二个实体吗?

    不需要,FRC应该做必要的。

    【讨论】:

    • 解决 tableView 重新加载问题将,除非其他人可以看到我缺少的东西,否则需要进行一些迭代。最好在聊天中完成,以避免在 cmets 中进行冗长的对话,但在你有 20 个代表之前你不能使用聊天。如果你用调试结果更新你的帖子,我会相应地更新我的答案。
    • 好吧,这几乎让它像我想要的那样工作。唯一的问题是再次选择行时再次获得“items.slcross = true to = false。我打开了附件类型以在选择时选中该行并在再次选择时将其关闭。我添加了 items.slcross = true 到.checkmark and = false to .None,它可以工作并且来回移动唯一的问题是复选标记停留在选定的行上并且不与移动的项目一起移动。这是太多工作,还是我应该使用 didDeselectRow 函数?
    • 我尝试了 didDeselectRow func,其设置与上述 func func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { let items = frc.objectAtIndexPath(indexPath) as! SList items.slcross = false } 相同,但将其更改为 false,但改回来没有运气。
    • @WillZimmer 由于您的代表现在是 20 岁,我认为您可以使用聊天。我已经创建了一个房间来回答你的问题...here
    猜你喜欢
    • 2011-04-03
    • 1970-01-01
    • 1970-01-01
    • 2012-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多