【问题标题】:Getting user input to copy from a TableViewController to a ViewController using Swift使用 Swift 将用户输入从 TableViewController 复制到 ViewController
【发布时间】:2018-12-08 18:32:26
【问题描述】:

我正在开发一个用户输入三个值(艺术家、专辑和发行日期)的应用。我正在尝试让这些用户输入的值“复制”到另一个 TableViewController。

FreshReleaseTableViewController(下面的代码)上显示的值,我需要将它们复制到 EditFreshReleaseViewController。

我该怎么办?

 import UIKit
 import CoreData
 import UserNotifications

 class FreshReleaseTableViewController: UITableViewController{

var freshreleases = [Release_Date]()

let dateFormatter = DateFormatter()

override func viewDidLoad() {
    super.viewDidLoad()

    //create a new button
    let button = UIButton.init(type: .custom)
    //set image for button
    button.setImage(UIImage(named: "Mic App Logo.png"), for: UIControlState.normal)

    dateFormatter.dateStyle = .full
    dateFormatter.timeStyle = .none

}

@objc func editAction() {
    let viewController = AddfreshreleaseViewController()
    navigationController?.present(viewController, animated: true, completion: nil)
}

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)

    let appDelegate = UIApplication.shared.delegate as! AppDelegate
    let context = appDelegate.persistentContainer.viewContext

    let fetchRequest = Release_Date.fetchRequest() as NSFetchRequest<Release_Date>

    let sortDescriptor1 = NSSortDescriptor(key: "artist", ascending: true)
    let sortDescriptor2 = NSSortDescriptor(key: "album", ascending: true)
    fetchRequest.sortDescriptors = [sortDescriptor1, sortDescriptor2]
    do {
        freshreleases = try context.fetch(fetchRequest)
    } catch let error {
        print("Could not fetch because of error: \(error).")
    }

    /*let startOfToday = Calendar.current.startOfDay(for: Date()) as NSDate
    let predicate = NSPredicate(format: "release_date > %@", startOfToday)
    fetchRequest.predicate = predicate*/

    NSFetchedResultsController<NSFetchRequestResult>()

    fetchRequest.predicate = NSPredicate(format: "isReleased = NO")

    tableView.reloadData()
}

// MARK: - Table view data source

override func numberOfSections(in tableView: UITableView) -> Int {
    // #warning Incomplete implementation, return the number of sections
    return 1
}

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    // #warning Incomplete implementation, return the number of rows
    return freshreleases.count
}

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

    let cell = tableView.dequeueReusableCell(withIdentifier: "FreshReleaseCellIdentifier", for: indexPath)

    let freshrelease = freshreleases[indexPath.row]

        cell.textLabel?.numberOfLines = 0

    let artist = freshrelease.artist ?? ""
    let album = freshrelease.album ?? ""
    cell.textLabel?.text = artist + "'s\nnew album '" + album + "'\nreleases"

    if let date = freshrelease.release_date as Date? {
        cell.detailTextLabel?.text = dateFormatter.string(from: date)
    } else {
        cell.detailTextLabel?.text = ""
    }

    return cell
}

// Override to support conditional editing of the table view.
override func tableView(_ tableView: UITableView, canEditRowAt indexPath: IndexPath) -> Bool {
    // Return false if you do not want the specified item to be editable.
    return true
}

// Override to support editing the table view.
override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
    if freshreleases.count > indexPath.row {
        let freshrelease = freshreleases[indexPath.row]

        // Remove notification
        if let identifier = freshrelease.release_dateId {
            let center = UNUserNotificationCenter.current()
            center.removePendingNotificationRequests(withIdentifiers: [identifier])
        }

        let appDelegate = UIApplication.shared.delegate as! AppDelegate
        let context = appDelegate.persistentContainer.viewContext
        context.delete(freshrelease)
        freshreleases.remove(at: indexPath.row)
        do {
            try context.save()
        } catch let error {
            print("Could not save \(error)")
        }
        tableView.deleteRows(at: [indexPath], with: .fade)
    }
}

@available(iOS 11.0, *)

override func tableView(_ tableView: UITableView,
               leadingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration?

{
    let modifyAction = UIContextualAction(style: .normal, title:  "Edit", handler: { (ac:UIContextualAction, view:UIView, success:(Bool) -> Void) in
        print("Update action ...")
        let MainStoryboard = UIStoryboard(name: "Main", bundle: Bundle.main)
        let vc : UIViewController = MainStoryboard.instantiateViewController(withIdentifier: "FreshReleaseEdit") as UIViewController
        self.present(vc, animated: true, completion: nil)
        success(true)

    })
    modifyAction.title = "Edit"
    modifyAction.backgroundColor = .blue

    return UISwipeActionsConfiguration(actions: [modifyAction])
}

/*
// Override to support rearranging the table view.
override func tableView(_ tableView: UITableView, moveRowAt fromIndexPath: IndexPath, to: IndexPath) {

}
*/

override func tableView(_ tableView: UITableView, canMoveRowAt indexPath: IndexPath) -> Bool {
    return true
}
 }

【问题讨论】:

    标签: swift uitableview input uiviewcontroller


    【解决方案1】:

    添加到您的 EditFreshReleaseViewController 变量中,该变量代表选定的新版本

    var selectedFreshRelease: Release_Date?
    

    现在在您声明将要显示的视图控制器的位置,将此控制器向下转换为EditFreshReleaseViewController

    let vc = MainStoryboard.instantiateViewController(withIdentifier: "FreshReleaseEdit") as! EditFreshReleaseViewController
    

    然后只需将其变量分配为索引indexPath.row上的freshReleases数组中的项

    vc.selectedFreshRelease = self.freshReleases[indexPath.row]
    

    最后,像你一样呈现这个视图控制器

    self.present(vc, animated: true, completion: nil)
    

    【讨论】:

    • 感谢您的帮助。对于在 FreshReleaseTableViewController 中放置这些代码行的位置,我有点困惑。
    • 主要滑动动作配置中的内部模块化动作
    • 我想我明白了,但是当我按下编辑按钮时,应用程序崩溃并显示以下错误消息
    • 已授予通知权限!更新操作...无法将“UINavigationController”(0x1d37e81e0)类型的值转换为“fresh_release.EditfreshreleaseViewController”(0x1042b7248)。 2018-12-16 22:41:53.378806-0500 新版本 [6927:1758562] 无法将“UINavigationController”(0x1d37e81e0)类型的值转换为“fresh_release.EditfreshreleaseViewController”(0x1042b7248)。 (lldb)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多