ios - 如何从模态视图重新加载背景 UITableView

标签 ios swift

我试图在 UITableViewCell 上显示核心数据中的信息。 我可以获取信息,但信息未显示在 UITableViewCell 上。

当我在CoreData上设置信息时,我使用Modal View。

我尝试使用 UITableView.reload() 但我无法在 UITableViewCell 上显示信息。

请让我知道当我从模态视图返回时如何显示信息。

这个类是关于在 UItableView 上显示信息的。

import UIKit
import CoreData

protocol FriendListTableViewDelegate {
    func reloadTable()
}

class FriendListViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, FriendListTableViewDelegate{


    @IBOutlet weak var friendListTableView: UITableView!

    var friends:[FriendBasicInfo] = []

    override func viewDidLoad() {
        super.viewDidLoad()
        getData()
    }
    // Disable to effect the reload
    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        reloadTable()
    }

    // fetch the information from CoreData
    func getData() {
        let context = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
        do {
            friends = try context.fetch(FriendBasicInfo.fetchRequest())
        } catch {
            print("error")
        }
    }

    func reloadTable() {
        friendListTableView.reloadData()
    }

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

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

        let friendCell = tableView.dequeueReusableCell(withIdentifier: "FriendListCell") as! FriendListTableViewCell

        let friendName = friendCell.viewWithTag(1) as? UILabel
        let friendImage = friendCell.viewWithTag(2) as? UIImageView

        friendName?.text = friends[indexPath.row].name
        friendImage?.image = friends[indexPath.row].photo?.toImage()

        return friendCell

    }

    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
        return 80
    }

}

这个类是从CoreData中获取信息

import UIKit
import XLPagerTabStrip
import Eureka
import CoreData
import ImageRow

class InputFriendInforViewController: FormViewController, IndicatorInfoProvider {

    var itemInfo: IndicatorInfo = "Info"
    var friendPhoto: UIImage?
    var friendName: String = ""
    var friendBirthday: Date?
    var friendGender: String = ""
    var friendListTableViewDelegate: FriendListTableViewDelegate!


    override func viewDidLoad() {
        super.viewDidLoad()

       form +++

        Section("Friend Information")
            <<< ImageRow(){
                $0.title = "Image"
                $0.sourceTypes = [.PhotoLibrary, .SavedPhotosAlbum, .Camera]
                $0.value = UIImage(named: "noImage")
                $0.onChange { [unowned self] row in
                                self.friendPhoto = row.value!
                            }
            }
            <<< TextRow(){ row in
                row.title = "Name"
                row.placeholder = "Enter Name here"
            }.onChange { name in
                self.friendName = name.value!
            }
            <<< DateRow(){ row in
                row.title = "Birthday"
                row.value = Date(timeIntervalSinceReferenceDate: 0)
            }.onChange {date in
                self.friendBirthday = date.value!
            }
        <<< PushRow<String>(){row in
                row.title = "Gender"
                row.options = ["Male","Female","Other"]
            }.onChange {gender in
                self.friendGender = gender.value!
            }

        +++ Section()
            <<< ButtonRow() {
                $0.title = "SAVE"
            }.onCellSelection {_, _ in
                self.saveInfo()
            }
    }

    // MARK: - IndicatorInfoProvider

    func indicatorInfo(for pagerTabStripController: PagerTabStripViewController) -> IndicatorInfo {
        return itemInfo
    }

    // save friend Info for Core Data
    func saveInfo (){

        guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else { return }

        let managedContext = appDelegate.persistentContainer.viewContext
        let friendEntity = NSEntityDescription.entity(forEntityName: "FriendBasicInfo", in: managedContext)!

        let friendInfo = NSManagedObject(entity: friendEntity, insertInto: managedContext)

        // make unique user ID
        let friendUid = NSUUID().uuidString

        // Image Data UIImage to png Data
        let pngImage = self.friendPhoto?.toPNGData()

        friendInfo.setValue(friendUid, forKey: "userID")
        friendInfo.setValue(pngImage, forKey: "photo")
        friendInfo.setValue(self.friendName, forKey: "name")
        friendInfo.setValue(self.friendBirthday, forKey: "birthday")
        friendInfo.setValue(self.friendGender, forKey: "gender")

        do {
            try managedContext.save()
            self.dismiss(animated: true, completion:nil)
        } catch let error as NSError {
            print("Could not save. \(error), \(error.userInfo)")
        }
    }
}

这个类是关于 UITableViewCell 的

import UIKit

class FriendListTableViewCell: UITableViewCell {

  @IBOutlet weak var sampleImageView: UIImageView!
  @IBOutlet weak var sampleLabel:UILabel!
}

V/r,

最佳答案

当您使用额外的数据源数组时,仅重新加载 TableView 不会考虑新插入的项目。

有几个选项

  1. 使用NSFetchedResultsController。它会在保存上下文时自动更新 UI。
  2. 关闭时将新项目插入数据源数组,并将新行插入 TableView 。
  3. 观察 NSManagedObjectContextDidSaveNotification 并按照 2 中的描述插入项目。
  4. 重新获取全部数据并重新加载 TableView 。

选项按效率排序。版本 1 是最有效的版本。

旁注:

viewWithTag 太过时了。你有网点,例如使用它们

cell.sampleLabel!.text = friends[indexPath.row].name

关于ios - 如何从模态视图重新加载背景 UITableView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59873854/

相关文章:

ios - 如何使用 Swift 获取 youtube channel 的所有播放列表?

iphone - EXC_BAD_ACCESS 与 MKPinAnnotationView

ios - swift - JSON 到 NSManagedObject

html - 如何在 Swift 3 中加载带有 HTML 的 CSS 文件?

ios - TextView 不显示在 ScrollView 上

ios - 使用表格单元格内的按钮从原型(prototype)单元格传递数据

objective-c - 如何将 Objective-C 指针数组转换为 Swift?

ios - 新的 iOS SDK 3.0,无需弃用 API 即可发布到用户墙

iphone - iPhone 4 可实现的最低往返音频延迟是多少?

ios - 土耳其语字符 ios