ios - 将数据与 segue 一起传递

标签 ios swift uiviewcontroller delegates segue

问题在于:我试图将一些数据从一个 ViewController 传递到另一个 InfoViewController。它看起来像这样:

This one will pass data:

to this one here

运行,应用程序,它看起来像这样:

This screen, when tapped on the cell, goes to:

This screen here.

除了这两个 View Controller ,我在这个应用程序中还有一些其他 View Controller ,它们的 Segues 工作正常,但是,当我点击单元格时,它确实转到 InfoViewController,但信息确实得不到更新。

这是我的代码:

import UIKit import CoreData

protocol sendNameDelegate {
    func sendName(name: String) }

protocol sendImageDelegate {
    func sendImage(image: UIImage) }

class MainViewController: UIViewController, UITableViewDataSource, UITableViewDelegate, sendDetailsToMVCDelegate, NSFetchedResultsControllerDelegate, NSCoding {

    @IBOutlet weak var tableView: UITableView!
    var namesListArray:[String] = []
    var imagesListArray:[UIImage] = []
    var delegateName: sendNameDelegate?
    var delegateImage: sendImageDelegate?

    required init(coder aDecoder: NSCoder) {
        super.init(coder: aDecoder)
        if let namesList = aDecoder.decodeObjectForKey("namesListArray") as? [String] {
            namesListArray = namesList
        } else {
            namesListArray = [String]()
        }
        if let imagesList = aDecoder.decodeObjectForKey("imagesListArray") as? [UIImage] {
            imagesListArray = imagesList
        } else {
            imagesListArray = [UIImage]()
        }
    }

    override func encodeWithCoder(aCoder: NSCoder) {
        aCoder.encodeObject(self.namesListArray, forKey: "namesListArray")
        aCoder.encodeObject(self.imagesListArray, forKey: "imagesListArray")
    }

    override func viewDidLoad() {
        let dir = getUserDir()
        let archiveName = "\(dir)/iRecipeList-namesListArray"
        if let loaded: AnyObject = NSKeyedUnarchiver.unarchiveObjectWithFile(archiveName) {
            self.namesListArray = (loaded as? [String])!
        }
        let archiveImage = "\(dir)/iRecipeList-imagesListArray"
        if let loaded: AnyObject = NSKeyedUnarchiver.unarchiveObjectWithFile(archiveImage) {
            self.imagesListArray = (loaded as? [UIImage])!
        }
    }

    override func viewDidAppear(animated: Bool) {
    }

    func sendDetailsToMVC (name: String, image: UIImage) {
        namesListArray.append(name)
        imagesListArray.append(image)
        let dir = getUserDir()
        let archiveName = "\(dir)/iRecipeList-namesListArray"
        NSKeyedArchiver.archiveRootObject(namesListArray, toFile: archiveName)
        let archiveImage = "\(dir)/iRecipeList-imagesListArray"
        NSKeyedArchiver.archiveRootObject(imagesListArray, toFile: archiveImage)
        tableView.reloadData()
    }

    func getUserDir() -> String {
        let userDir = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true)
        return userDir[0] as! String
    }


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

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
        let row = indexPath.row
        let name = namesListArray[row]
        println("\(row)/")
        let image = imagesListArray[row]
        var cell = UITableViewCell(style: UITableViewCellStyle.Default, reuseIdentifier: nil)
        cell.textLabel?.text = name
        cell.imageView!.image = image

        return cell }

    func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {

        var row = indexPath.row

        var name = namesListArray[row]
        delegateName?.sendName(name)
        var image = imagesListArray[row]
        delegateImage?.sendImage(image)

        performSegueWithIdentifier("goToInfoVC", sender: self)
    }

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        if segue.identifier == "newReciep" {
            var vc = segue.destinationViewController as! DetailsViewController
            vc.delegateDetails = self
        }
    } }

和:

import UIKit
import CoreData

class InformationViewController: UIViewController, UITableViewDelegate, UITableViewDataSource, sendNameDelegate, sendImageDelegate {


    @IBOutlet var recipeNameLabel: UILabel!
    @IBOutlet var recipeImageView: UIImageView!
    @IBOutlet var RecipeHowToDo: UILabel!
    @IBOutlet var recipeIngredientsTableView: UITableView!
    var ingredientsListArray = [String]()

    func sendName(name: String) {
        recipeNameLabel.text = name
    }

    func sendImage(image: UIImage) {
        recipeImageView.image = image
    }


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

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

        let row = indexPath.row
        let ingredient = ingredientsListArray[row]
        var cell = UITableViewCell(style: UITableViewCellStyle.Default, reuseIdentifier: nil)
        cell.textLabel!.text = ingredient
        return cell
    }

    override func viewDidLoad() {

    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()

    }
}

我似乎无法将此信息正确发送到最后一个 View Controller 。有人有什么想法吗?

PS:抱歉图片太多,只是觉得有用。

最佳答案

您当前正在调用 sendName 和 sendImage 委托(delegate),然后再为它们赋值。这就是为什么他们没有访问您的 InformationViewController 的原因。你应该这样做:

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        if segue.identifier == "newReciep" {
            var vc = segue.destinationViewController as! DetailsViewController
            vc.delegateDetails = self
        }else if(segue.identifier == "goToInfoVC"){
            var vc = segue.destinationViewController as! InformationViewController

            let row = self.tableView.indexPathForSelectedRow()?.row
            var name = namesListArray[row]
            var image = imagesListArray[row]
            vc.name = name
            vc.image = image

        } 
    }

然后在 infoViewController 的 ViewDidLoad 方法中,您可以将 name 和 image 的值设置为您的 View 。

关于ios - 将数据与 segue 一起传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30688168/

相关文章:

iphone - 如何在 iPhone 中制作无限 ScrollView ?

ios - 如何快速组织uitableview的动态数量作为滑动页面

ios - 我很难从 objective-c 中的复制对象中保留属性值

ios - 在 iOS 应用程序的 UITableViewCell 中同时设置 accessoryType 和 accessoryView - 可行吗?

ios - 当用户滚动相邻的 UIScrollView 时,我的 UIView 子类不调用 drawRect

ios - 不支持的 URL Swift 5

ios - 无法控制表单中的动画?

ios - 页面指​​示器快速不同步

ios - 离开 View Controller 时,UISwitch 不会保持其值

ios - UIViewController swift 中的多个子 TableView Controller