我怎样才能传递一个结构的一个部分?

时间:2017-02-21 04:06:45

标签: ios swift

我试图只传递一个struct的图像部分(也包含两个textFields,另一个我想不通过的imageView)。

这是tableViewController

import UIKit

class SentMemesTableViewController: UITableViewController {

    var _tableView: UITableView!
    var memeData: [Meme] = []


    //calling memes from array in Delegate
    let appDelegate = UIApplication.shared.delegate as! AppDelegate
    var memes: [Meme] {
        return appDelegate.memes
    }

    override func viewWillAppear(_ animated: Bool) {
        tableView.reloadData()
    }


    override func viewDidLoad() {
        super.viewDidLoad()

        tableView.isScrollEnabled = true

    }

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "MemeDetailViewController" ,
        let nextScene = segue.destination as? MemeDetailViewController ,
            let indexPath = tableView.indexPathForSelectedRow {
            let selectedMeme = memes[indexPath.row].memedImage
            nextScene.sentMemeView.image = Meme.memedImage
        }

    }


    // MARK: - Table view data source

    override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

            //navigationController!.pushViewController(MemeDetailViewController, animated: true)

    }

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

    // Here it is! -----

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let tableViewCell = tableView.dequeueReusableCell(withIdentifier: "sentMemesTableView") as! MemeTableViewCell
        let meme = memes[indexPath.row]

        tableViewCell.tableViewImage.image = meme.memedImage
        tableViewCell.tableViewLabel.text = "\(meme.topText)...\(meme.bottomText)"



        return tableViewCell
    }

    // 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 conditional rearranging of the table view.
    override func tableView(_ tableView: UITableView, canMoveRowAt indexPath: IndexPath) -> Bool {
        // Return false if you do not want the item to be re-orderable.
        return false

    }

    func deleteMemesInTableViewCell(_ index: Int) {
        let appDelegate = UIApplication.shared.delegate as! AppDelegate
        appDelegate.memes.remove(at: index)
    }

    override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
        if (editingStyle == UITableViewCellEditingStyle.delete) {
            tableView.beginUpdates()
            deleteMemesInTableViewCell(indexPath.row)
            tableView.deleteRows(at: [indexPath], with: UITableViewRowAnimation.left)
            tableView.endUpdates()
        }
    }
}

这是Meme和SentMemeView结构。

import Foundation
import UIKit

struct Meme {
    let topText: String
    let bottomText: String
    let originalImage: UIImage
    let memedImage: UIImage
}


struct SentMemeImageView {
    var memedImageDetailVC: UIImageView
}

我找不到成功调用它的方法。

这是MemeDetailViewController。我只需要sentMemeView来显示SentMemeImageView。

class MemeDetailViewController: UIViewController {
    var meme = SentMemeImageView?.self

    @IBOutlet weak var sentMemesBtn: UIBarButtonItem!
    @IBOutlet weak var editBtn: UIBarButtonItem!
    @IBOutlet weak var sentMemeView: UIImageView!

    func displayMeme(_ meme: SentMemeImageView) {
    }

    @IBAction func launchMemeEditorViewController(_ sender: Any) {
        _ = navigationController?.popViewController(animated: true)
    }

    //unwinding to the view before (the collectionView, or the tableView)

    @IBAction func unwindVC(for unwindSegue: UIStoryboardSegue, towardsViewController subsequentVC: UIViewController) {
        self.dismiss(animated: true, completion: nil)
    }
}

1 个答案:

答案 0 :(得分:0)

首先,伤心地说,你的代码是相当搞砸: 您有三种不同类型的数据源,一些被忽略,一些被使用,但不是以一致的方式:

  • 来自应用代表的数据(删除数据)
  • memeData属性(显示数据)
  • memes属性(忽略

您应该关注数据的存储位置以及如何访问数据。

其次,您不会将视图从一个视图控制器发送到另一个视图控制器,但数据。所以请使用UIImage而不是UIImageView。因此,您将SentMemeImage交给细节控制器。

我试着稍微清理一下代码,但只是为了回答你的明确问题。请重构一下!

struct Meme {
    let topText: String
    let bottomText: String
    let originalImage: UIImage
    let memedImage: UIImage
}

struct SentMemeImage {
    var memedImage: UIImage
}


class SentMemesTableViewController: UITableViewController {
    var memeData: [Meme] = []

     // ----8<---- snipp ----8<----

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "MemeDetailViewController" ,
            let nextScene = segue.destination as? MemeDetailViewController ,
            let indexPath = tableView.indexPathForSelectedRow {
            let selectedMeme = memeData[indexPath.row]
            let sentMemeImage = SentMemeImage(memedImage: selectedMeme.memedImage)
            nextScene.meme = sentMemeImage
        }
    }

    // ----8<---- snipp ----8<----
}

class MemeDetailViewController: UIViewController {
    var meme:SentMemeImage?

    @IBOutlet weak var sentMemesBtn: UIBarButtonItem!
    @IBOutlet weak var editBtn: UIBarButtonItem!
    @IBOutlet weak var sentMemeView: UIImageView!

    func displayMeme() {
        self.sentMemeView.image = self.meme?.memedImage
    }
}