Swift-通过代码链接UIViewController

Swift-通过代码链接UIViewController,swift,uitableview,uiviewcontroller,edit,swipe,Swift,Uitableview,Uiviewcontroller,Edit,Swipe,我正在尝试将编辑按钮链接回UIViewController AddfreshreleaseViewController。当您向右滑动单元格时,此代码在左侧显示编辑按钮,但当我添加“performSegue”以尝试返回UIViewController时,每次我现在向编辑按钮滑动时,应用程序都会崩溃。有什么建议我可以让它工作吗 @available(iOS 11.0, *) override func tableView(_ tableView: UITableView,

我正在尝试将编辑按钮链接回UIViewController AddfreshreleaseViewController。当您向右滑动单元格时,此代码在左侧显示编辑按钮,但当我添加“performSegue”以尝试返回UIViewController时,每次我现在向编辑按钮滑动时,应用程序都会崩溃。有什么建议我可以让它工作吗

@available(iOS 11.0, *)
override func tableView(_ tableView: UITableView,
               leadingSwipeActionsConfigurationForRowAt indexPath: IndexPath) -> UISwipeActionsConfiguration?

{
    let modifyAction = UIContextualAction(style: .normal, title:  "Update", handler: { (ac:UIContextualAction, view:UIView, success:(Bool) -> Void) in
        print("Update action ...")
        success(true)

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

    performSegue(withIdentifier: "addFreshRelease", sender: self)

    return UISwipeActionsConfiguration(actions: [modifyAction])

}
以下是我用于FreshReleaseTableViewController的代码:

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


    //let button1 = UIButton()
    //button1.addTarget(self, action: #selector(editAction), for: .touchUpInside)

    //self.tableView.backgroundColor = UIColor.white

}

/* @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).")
    }
    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:  "Update", handler: { (ac:UIContextualAction, view:UIView, success:(Bool) -> Void) in
        print("Update action ...")
        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
}

}
import UIKit
import CoreData
import UserNotifications

class AddfreshreleaseViewController: UIViewController {

@IBOutlet var artisttextfield: UITextField!
@IBOutlet var albumtextfield: UITextField!
@IBOutlet var releasedatePicker: UIDatePicker!


override func viewDidLoad() {
    super.viewDidLoad()

    releasedatePicker.minimumDate = Date()

    // Do any additional setup after loading the view, typically from a nib.
}
@IBAction func saveTapped( _ sender: UIBarButtonItem) {

    let artist = artisttextfield.text ?? ""
    let album = albumtextfield.text ?? ""
    let releasedate = releasedatePicker.date

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

    let newRelease = Release_Date(context: context)
    newRelease.artist = artist
    newRelease.album = album
    newRelease.release_date = releasedate as NSDate?
    newRelease.release_dateId = UUID().uuidString

    if let uniqueId = newRelease.release_dateId {
        print("The freshreleaseId is \(uniqueId)")
    }

    do {
        try context.save()
        let message = "\(artist)'s new album \(album) releases Today!"
        let content = UNMutableNotificationContent()
        content.body = message
        content.sound = UNNotificationSound.default()
        var dateComponents = Calendar.current.dateComponents([.month, .day],
            from: releasedate)
        dateComponents.hour = 09
        dateComponents.minute = 00
        let trigger = UNCalendarNotificationTrigger(dateMatching: dateComponents,
            repeats: true)
        if let identifier = newRelease.release_dateId {

            let request = UNNotificationRequest(identifier: identifier,
                content: content, trigger: trigger)
            let center = UNUserNotificationCenter.current()
            center.add(request, withCompletionHandler: nil)
        }
    } catch let error {
        print("Could not save because of \(error).")
    }

    dismiss(animated: true, completion: nil)

    print("Added a Release Date!")
    print("Artist: \(newRelease.artist)")
    print("Album: \(newRelease.album)")
    print("Release Date: \(newRelease.release_date)")
}

@IBAction func cancelTapped(_ sender: UIBarButtonItem) {
    dismiss(animated: true, completion: nil)
}



}
所以我想做的是,当在FreshReleaseTableViewController中按下edit按钮时,它会显示AddfreshreleaseViewController

但是,“编辑”按钮是用代码编写的,而不是实际的条形按钮项


更复杂的是,当用户转到AddfreshreleaseViewController时,他们将信息输入三个字段:艺术家、唱片集和发行日期,然后保存在FreshReleaseTableViewController上。因此,当FreshReleaseTableViewController中的编辑按钮将它们带回AddfreshreleaseViewController时,我需要在三个字段中输入艺术家、唱片集和发行日期的用户信息,这样,如果初始输入有问题,用户可以编辑字段。

我不确定问题的确切性质,但是,如果您正在使用故事板定义的序列将数据从ViewController1移动到ViewController2,然后希望将编辑的数据移回通常使用左手导航按钮完成的展开中的第一个VC,则以下代码将执行此操作:

在第一个VC ViewController1中,从第二个VC ViewController2中定义所需内容,并在segue中发送self:

var someData:String!

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "ShowViewController2" {
        if let vc = segue.destination as? ViewController2 {
            vc.firstVC = self
        }
    }
}
在第二个视图控制器中,将第一个VC定义为弱,并将数据传递回ViewWillEnglish,UIViewController属性从ParentViewController移动


信息太少,但我会尝试猜测你的行为体验

但是,为什么要在完成修改操作时执行分段?应使用以下命令弹出当前视图控制器:

例如:

 _ = navigationController?.popViewController(animated: true)

你还没有提供的细节很重要。1在IB中是否正确定义了addFreshRelease?2您是通过IB定义这个序列的,对吗?你得到的确切欧元是多少?4.你能提供足够的代码供我们复制吗?5我正在尝试将编辑按钮链接回我的UIViewController。。。。专注于那一块,你想做什么?有几种方法可以将数据移回视图控制器堆栈中。再说一次:它确实涉及到您尚未提供的细节。据我所知,IB被正确定义为addFreshRelease。我没有收到错误消息,构建工作正常,但当我滑动方向以显示编辑按钮时,应用程序崩溃。在该应用程序中,用户在addFreshReleaseViewController的三个字段中提供信息,并在FreshReleaseTableViewController中出现日期时将其保存为提醒。我试图让FreshReleaseTableViewController中的编辑按钮返回到他们在addFreshReleaseViewController中输入信息的位置,以便他们可以在错误时进行更改。IB是什么?它在属性检查器标题中定义为addFreshReleaseIB==接口生成器。回到过去,也许是Xcode 4?有两个独立的应用程序,Xcode和Interface Builder。还有,解释IB是什么的最简单的方法,你是在使用故事板吗?我认为你是-因此使用IB。定义和使用segue是不可能的。我相信你几乎可以定义它,但如果没有故事板就不能使用它。现在,我有一个代码,它使用一个故事板和一个导航控制器,通过三个VCs工作。选择、编辑主题、编辑其他。它在所有三个编辑之间使用一个segue,如果用户希望在两个编辑之间切换,它将数据从另一个编辑传递回编辑主体VCs。你认为这对你有帮助吗?我很乐意贴出来。我提供了更多的信息,希望它能澄清一些事情。我提供了更多的信息,希望它能澄清一些事情
 _ = navigationController?.popViewController(animated: true)