字符串未从prepareForSegue

时间:2016-09-18 22:53:07

标签: ios swift segue

我的StoryBoard上有push segue,名为toGuestVC

我使用它来转换到ViewController方法中的下一个didSelectRowAtIndexPath,如下所示:

override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    let username = followUsernameArray[indexPath.row]
    performSegue(withIdentifier: SG_TO_GUEST_VIEW_CONTROLLER, sender: username)
}

然后在我的prepareForSegue

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == SG_TO_GUEST_VIEW_CONTROLLER {
        if let nextVC = segue.destination as? GuestCollectionVC, let sender = sender as? String {
            print("PRINTING NEXT VC: \(nextVC)") //This prints out the memory address. Not sure if this is what you meant by print nextVC.
            nextVC.guestUser = sender
        }
    }
}

由于某些原因,prepareForSegue中的这一行未运行:

  

nextVC.guestUser = sender.username

当我尝试在nextViewController中打印出值guestUser时,guestUser的值为nil。但是,当我在prepareForSegue方法中打印出发件人的值时,它不是nil

我的sender值是否未传递到下一个ViewController?我无法找到解决这个问题的任何想法吗?

GuestCollectionVC实施:

import UIKit
import Parse

private let reuseIdentifier = "Cell"

class GuestCollectionVC: UICollectionViewController {

var guestUser: String!

override func viewDidLoad() {
    super.viewDidLoad()
    print("PRINTING SELF IN GuestCollectionVC: \(self)")
    loadPosts()
}

    func loadPosts() {
        //Load posts query
        let query = PFQuery(className: PF_POSTS_CLASS)
        query.limit = postCount
        //Getting error here below this comment when I use guestUser since it is nil
        query.whereKey(PF_POSTS_USERNAME_COLUMN, equalTo: guestUser)
        query.findObjectsInBackground { (result: [PFObject]?, error: Error?) -> Void in
            if error == nil {
                if let result = result {

                    self.uuidOfPosts.removeAll(keepingCapacity: false)
                    self.imageArrayOfPFFIle.removeAll(keepingCapacity: false)

                    for postObject in result {
                        if let uuid = postObject[PF_POSTS_UUID_COLUMN] as? String, let pic = postObject[PF_POSTS_PIC_COLUMN] as? PFFile {
                            self.uuidOfPosts.append(uuid)
                            self.imageArrayOfPFFIle.append(pic)
                        }
                    }
                    self.collectionView?.reloadData()
                }
            }else if error != nil {
                print("ERROR FROM GUEST COLLECTION VC FROM loadPosts FUNCTION: \(error?.localizedDescription)")
            }
        }
    }
}

所以这是我在GuestViewController中的实现。在我使用变量loadPosts的{​​{1}}方法中,我收到错误:

  

致命错误:在解包可选值时意外发现nil

2 个答案:

答案 0 :(得分:0)

从控制台打印

  

打印下一个VC:“InstagramClone.GuestCollectionVC:0x7a6c5cc0”

     

在GuestCollectionVC中打印SELF:“InstagramClone.GuestCollectionVC:0x7a6c5100”

现在显而易见的是,GuestCollectionVC的隐藏意外实例已经创建。因此,根据这两个对象调用其viewDidLoad方法的顺序(可以是任何顺序),会发生不同的错误。 nextVC viewDidLoad方法中也可能存在其他错误,但这是其他问题的其他错误。

你遇到了这个问题,因为你创建了动作 segue,它在单击鼠标时自动工作(创建隐藏视图控制器),同时你在代码中执行这个segue,创建第二个控制器{ {1}}。

要解决问题,您应该找到并删除该segue并添加新的segue,而不是视图控制器的某个元素的 action segue,但视图控制器之间的“空”segue。要创建此类型的segue,您应该选择第一个视图控制器,按住“control”键并开始从第一个视图控制器顶部的黄色方块(该符号控制器本身)拖动到下一个视图控制器,选择“显示“,并设置标识符。

答案 1 :(得分:-1)

由于我没有tableView方法中的值的完整上下文,我只能推测。也就是说,您传入的发件人应该是视图控制器:

performSegue(withIdentifier: "toGuestVC", sender: username)

你传递了一个名为username的值,它看起来像一个字符串值?它应该是这样的:

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

其中self是您的视图控制器。如果您将字符串值传递给sender,那么在prepareForSegue方法中,sender没有名为username的属性,发件人实际上 username。因此,您应该将值传递到其他地方:

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    let indexPath = self.tableView.indexPathForSelectedRow
    if let nextVC = segue.destination as? GuestCollectionVC {
        nextVC.guestUser = followUsernameArray[indexPath.row]
    }
}