我的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
答案 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]
}
}