如何将实体中的属性数据加载到单个(1)UIViewController中?

时间:2017-03-16 19:28:44

标签: ios swift core-data load-data-infile

我是Swift编码的新手,我一直在使用Aaron Caines的Udemy教程,这本来很棒。他做的教程是使用UITableViewController。

我有一个使用单个UIViewController的应用程序(仅一个视图,它不是UITableViewController)。我已经将CoreData加载到构建阶段。我已经能够验证数据是否保存在属性中,但由于某种原因,我无法将数据加载回我在视图控制器中的两个文本框和一个图像视图中。

我在代码中添加了几个问题作为评论。

应该像设置变量一样简单:

@IBOutlet var textName: UITextField!
@IBOutlet var descriptionName: UITextField!
@IBOutlet var imageView: UIImageView!

调用实体并使持久容器准备好加载和接收数据:

let pc = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext

获取数据

var frc : NSFetchedResultsController = NSFetchedResultsController<NSFetchRequestResult>()

    func  fetchRequest() -> NSFetchRequest<NSFetchRequestResult> {

        let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "NamedEntity")

        // DO I NEED A SORTER IF I'M NOT USING A TABLEVIEW?

        //let sorter = NSSortDescriptor(key: "accounttext", ascending: false)
        //fetchRequest.sortDescriptors = [sorter]

        return fetchRequest

    }


    func getFRC() -> NSFetchedResultsController<NSFetchRequestResult> {

        frc = NSFetchedResultsController(fetchRequest: fetchRequest(), managedObjectContext: pc, sectionNameKeyPath: nil, cacheName: nil)

        //OCCASIONALLY THERE'S AN ISSUE WITH THE sectionNameKeyPath. 
        //THE ERROR INVOLVES TRYING TO "UNWRAP A NIL VALUE". 
        //IS THERE ANOTHER VALUE I SHOULD BE CONSIDERING?

        return frc

    }

在加载或显示视图时获取数据:

override func viewDidLoad() {
        super.viewDidLoad()
        frc = getFRC()
        frc.delegate = self

        do {

            try frc.performFetch()

        }

        catch {

            print(error)
            return

        }

        //  WHAT DO I USE HERE IF I'M NOT USING A TABLEVIEW?

        self.tableView.reloadData()

    }

    override func viewDidAppear(_ animated: Bool) {

        frc = getFRC()
        frc.delegate = self

        do {

            try frc.performFetch()

        }

        catch {

            print(error)
            return

        }

        //  WHAT DO I USE HERE IF I'M NOT USING A TABLEVIEW?

        self.tableView.reloadData()

    }

然后将其加载到相应的框中:

 //THIS IS WHERE THINGS GET STUCK
 // HOW DO I CALL THE ATTRIBUTES OF MY ENTITY AND UPDATE MY VARIABLES IF I'M NOT USING A TABLEVIEW?

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {


        let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) as! cellAccountTableViewCell 

        let item = frc.object(at: indexPath) as! Entity

        cell.nameText.text = item.accounttext  

        cell.descriptionText.text = item.amounttext 

        cell.imageView.image = UIImage(data: (item.image)! as Data) 

        return cell
    }

我只有2个文本框和1个图像视图。我花了最近三天搜索了几十个无用的论坛主题和无数的youtube视频来获得这个答案,但似乎每个人都提供了一个使用表视图控制器的教程。

我发现的最有用的东西是电子军械库的视频。这有助于我理解实体(aties),attrubutes和persistentContainer的结构。它还涉及数据库的关系方面。

https://www.youtube.com/watch?v=da6W7wDh0Dw

我可以在ONE(1)单个UIViewController上使用核心数据,如果是这样,我如何调用数据并将其加载到相应的字段中?如果还有其他信息,请告诉我。

我真的想了解核心数据流程。我错过了什么,或者我对加载过程有什么不了解?任何帮助将不胜感激!

谢谢,

1 个答案:

答案 0 :(得分:0)

  

我有一个使用单个UIViewController的应用程序(只有一个视图,它不是UITableViewController)。

     

我只有2个文本框和1个图像视图。

假设从fetch中只返回一个实体(否则你将如何显示它们?),可能是这样的:

LogisticsElectronicAddress

public void insert()
{

    ttsbegin;
    if (!this.Location)
    {
        this.Location = LogisticsLocation::create('', false).RecId;
    }

/* This is the modifications I made to check for an other primary address
// Move this here
    if (!this.otherPrimaryExists())
        {
         this.IsPrimary = true;   
        }

*/


    super();
    this.updatePrimary(this.IsPrimary);

    ttscommit;

    this.invalidatePresenceInfo();
}