PerformSegue从UICollectionReusableView(报头)的自定义按钮夫特

问题描述:

我有一个headerView其中我有一个浮动按钮。由于浮动按钮中的所有子项都是以编程方式生成的,并且它是headerView的子视图,所以我无法调用performSegue。我试图创建一个委托方法,但我完全搞砸了。我知道协议可能是解决方案,但我很不确定如何正确解决问题。 我附上下面PerformSegue从UICollectionReusableView(报头)的自定义按钮夫特

headerView代码headerView的图像:

class ProfileHeader: UICollectionReusableView, FloatyDelegate { 

@IBOutlet weak var pname: UILabel! 
@IBOutlet weak var pusername: UILabel! 
@IBOutlet weak var profilePic: UIImageView! 
@IBOutlet weak var userDesc: UILabel! 
@IBOutlet weak var allviews: UILabel! 
@IBOutlet weak var allphotos: UILabel! 



var user : User! 
var userposts = [String]() 
var currentViewUser: String! 
var floaty = Floaty() 

let uid = KeychainWrapper.standard.string(forKey: KEY_UID) 

override func awakeFromNib() { 
    super.awakeFromNib() 

    user = User() 

    fetchCurrentUser() 
    profilePic.addBlackGradientLayer(frame: profilePic.bounds) 
    layoutFAB() 
} 




func layoutFAB() { 

    floaty.openAnimationType = .slideDown 
    floaty.hasShadow = false 
    floaty.addItem("Edit Profile", icon: UIImage(named: "")) { item in 
     // here is where the segue is to be performed. 
    } 

    floaty.paddingY = (frame.height - 50) - floaty.frame.height/2 
    floaty.fabDelegate = self 
    floaty.buttonColor = UIColor.white 
    floaty.hasShadow = true 
    floaty.size = 45 

    addSubview(floaty) 

} 


func fetchCurrentUser(){ 
    if uid != nil { 
     FBDataservice.ds.REF_CURR_USER.observeSingleEvent(of: .value, with: { (snapshot) in 
      if let allData = snapshot.value as? Dictionary<String, Any> { 
       if let cred = allData["credentials"] as? Dictionary<String, Any> { 
        let user = User(userid: snapshot.key, userData: cred) 
        self.pusername.text = user.username 
        self.pname.text = user.name 
        self.userDesc.text = user.aboutme 
        self.allphotos.text = String(user.photos) 
        self.allviews.text = String(user.views) 
        if user.userPic != nil { 
         let request = URL(string: user.userPic) 
         Nuke.loadImage(with: request!, into: self.profilePic) 
        } else { 
         return 
        } 
       } 
      } 

     }) 
    } 
} 
} 

CollectionViewController代码:

class ProfileVC: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate, UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout { 


@IBOutlet weak var collectionView: UICollectionView! 

var user : User! 
var userposts = [String]() 
var post = [Posts]() 
var currentViewUser: String! 
var imagePicker: UIImagePickerController! 
var fetcher: Fetcher! 
var imageFromImagePicker = UIImage() 


let uid = KeychainWrapper.standard.string(forKey: KEY_UID) 

override func viewDidLoad() { 
    super.viewDidLoad() 

    user = User() 
    fetcher = Fetcher() 
    imagePicker = UIImagePickerController() 
    imagePicker.delegate = self 

    collectionView.delegate = self 
    collectionView.dataSource = self 



    initializeUserPost() 



    let nib = UINib(nibName: "ProfileCell", bundle: nil) 
    collectionView.register(nib, forCellWithReuseIdentifier: "ProfileCell") 





} 


func editProfileTapped() { 
    performSegue(withIdentifier: "manageconnections", sender: nil) 
} 

@IBAction func manageConnections(_ sender: Any) { 
    performSegue(withIdentifier: "manageconnections", sender: nil) 
} 


override func viewWillAppear(_ animated: Bool) { 
    super.viewWillAppear(true) 
    collectionView.reloadData() 
} 


@IBAction func gotoSettings(_ sender: Any) { 
    performSegue(withIdentifier: "openSettings", sender: nil) 
} 



@IBAction func newPost(_ sender: Any) { 
    uploadNewPost() 
} 

@IBAction func backToFeed(_ sender: Any) { 
    performSegue(withIdentifier: "feedroute", sender: nil) 
} 

@IBAction func searchUsers(_ sender: Any) { 
    performSegue(withIdentifier: "searchNow", sender: nil) 
} 


func initializeUserPost() { 

     FBDataservice.ds.REF_POSTS.observe(.value, with: { (snapshot) in 
      if let snap = snapshot.value as? Dictionary<String, Any> { 
       for snapy in snap { 
        if let userimages = snapy.value as? Dictionary<String, Any> { 
         let author = userimages["author"] as? String 
         if author! == self.uid! { 
          let images = userimages["imageurl"] as? String 
          self.userposts.append(images!) 

         } 
        } 
       } 
      } 
      self.collectionView.reloadData() 
     }) 


} 

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 
    let userImages = userposts[indexPath.row] 
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "ProfileCell", for: indexPath) as! ProfileCell 
    cell.fillCells(uid: uid!, userPost: userImages) 
    return cell 
} 


func numberOfSections(in collectionView: UICollectionView) -> Int { 
    return 1 
} 


func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { 
    return userposts.count 


} 

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { 


     let selecteditem : String! 
     selecteditem = userposts[indexPath.row] 
     performSegue(withIdentifier: "lol", sender: selecteditem) 

} 

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    if segue.identifier == "lol" { 
     if let detailvc = segue.destination as? PhotoDetailVC { 
      if let bro = sender as? String { 
       detailvc.image = bro 
      } 
     } 
    } 
} 


func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView { 

    let view = collectionView.dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: "ProfileHeader", for: indexPath) as! ProfileHeader 
    return view 
} 




func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { 

     let width = (collectionView.bounds.size.width/3) - 1 
     print(width) 
     let size = CGSize(width: width, height: width) 
     return size 

} 

func collectionView(_ collectionView: UICollectionView, 
        layout collectionViewLayout: UICollectionViewLayout, 
        minimumInteritemSpacingForSectionAt section: Int) -> CGFloat { 
    return 1.0 
} 

func collectionView(_ collectionView: UICollectionView, layout 
    collectionViewLayout: UICollectionViewLayout, 
        minimumLineSpacingForSectionAt section: Int) -> CGFloat { 
    return 1.0 
} 
+0

你的代码在哪里? –

+0

你在问哪个码?处理浮子按钮? –

+0

您headerView将有助于我们 –

解决你的问题,你应该使用一个名为委托模式。

代表意味着您需要做一些工作来执行HeaderView的继续工作,而这可以实现,在这种情况下您的工作是ProfileVC

1 - 创建HeaderView或其他文件中的协议,这是你的电话。

2 - 在HeaderView添加的协议变量类型以及与从的viewController通过。

​​3210

}

3 - 最后,编辑您ProfileVC实施HeaderViewDelegate协议,并把它传递给你的HeaderView

class ProfileVC: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate, UICollectionViewDelegate, UICollectionViewDataSource, UICollectionViewDelegateFlowLayout, HeaderViewDelegate { 

@IBOutlet weak var collectionView: UICollectionView! 

var user : User! 
var userposts = [String]() 
var post = [Posts]() 
var currentViewUser: String! 
var imagePicker: UIImagePickerController! 
var fetcher: Fetcher! 
var imageFromImagePicker = UIImage() 

let uid = KeychainWrapper.standard.string(forKey: KEY_UID) 

override func viewDidLoad() { 
    super.viewDidLoad() 

    user = User() 
    fetcher = Fetcher() 
    imagePicker = UIImagePickerController() 
    imagePicker.delegate = self 

    collectionView.delegate = self 
    collectionView.dataSource = self 

    initializeUserPost() 


    let nib = UINib(nibName: "ProfileCell", bundle: nil) 
    collectionView.register(nib, forCellWithReuseIdentifier: "ProfileCell") 

} 

//Method from the new protocol 
func fabItemClicked(){ 
//Perform your segue here. 
} 

func editProfileTapped() { 
    performSegue(withIdentifier: "manageconnections", sender: nil) 
} 

@IBAction func manageConnections(_ sender: Any) { 
    performSegue(withIdentifier: "manageconnections", sender: nil) 
} 


override func viewWillAppear(_ animated: Bool) { 
    super.viewWillAppear(true) 
    collectionView.reloadData() 
} 


@IBAction func gotoSettings(_ sender: Any) { 
    performSegue(withIdentifier: "openSettings", sender: nil) 
} 



@IBAction func newPost(_ sender: Any) { 
    uploadNewPost() 
} 

@IBAction func backToFeed(_ sender: Any) { 
    performSegue(withIdentifier: "feedroute", sender: nil) 
} 

@IBAction func searchUsers(_ sender: Any) { 
    performSegue(withIdentifier: "searchNow", sender: nil) 
} 


func initializeUserPost() { 

     FBDataservice.ds.REF_POSTS.observe(.value, with: { (snapshot) in 
      if let snap = snapshot.value as? Dictionary<String, Any> { 
       for snapy in snap { 
        if let userimages = snapy.value as? Dictionary<String, Any> { 
         let author = userimages["author"] as? String 
         if author! == self.uid! { 
          let images = userimages["imageurl"] as? String 
          self.userposts.append(images!) 

         } 
        } 
       } 
      } 
      self.collectionView.reloadData() 
     }) 


} 

func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 
    let userImages = userposts[indexPath.row] 
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "ProfileCell", for: indexPath) as! ProfileCell 
    cell.fillCells(uid: uid!, userPost: userImages) 
    return cell 
} 


func numberOfSections(in collectionView: UICollectionView) -> Int { 
    return 1 
} 


func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { 
    return userposts.count 


} 

func collectionView(_ collectionView: UICollectionView, didSelectItemAt indexPath: IndexPath) { 


     let selecteditem : String! 
     selecteditem = userposts[indexPath.row] 
     performSegue(withIdentifier: "lol", sender: selecteditem) 

} 

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
    if segue.identifier == "lol" { 
     if let detailvc = segue.destination as? PhotoDetailVC { 
      if let bro = sender as? String { 
       detailvc.image = bro 
      } 
     } 
    } 
} 


func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView { 

    let view = collectionView.dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: "ProfileHeader", for: indexPath) as! ProfileHeader 
    view.delegate = self 
    return view 
} 




func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize { 

     let width = (collectionView.bounds.size.width/3) - 1 
     print(width) 
     let size = CGSize(width: width, height: width) 
     return size 

} 

func collectionView(_ collectionView: UICollectionView, 
        layout collectionViewLayout: UICollectionViewLayout, 
        minimumInteritemSpacingForSectionAt section: Int) -> CGFloat { 
    return 1.0 
} 

func collectionView(_ collectionView: UICollectionView, layout 
    collectionViewLayout: UICollectionViewLayout, 
        minimumLineSpacingForSectionAt section: Int) -> CGFloat { 
    return 1.0 
} 

不要忘记编辑此方法并传入selfHeaderView

func collectionView(_ collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, at indexPath: IndexPath) -> UICollectionReusableView { 

    let view = collectionView.dequeueReusableSupplementaryView(ofKind: kind, withReuseIdentifier: "ProfileHeader", for: indexPath) as! ProfileHeader 
    view.delegate = self 
    return view 
} 
+0

非常感谢您的答复! 我试着实现这一点,它显示我错误'意外地发现零,而解包可选值。 –

+0

可能是你的代表是nill,尽量使用FUNC setDelegate()方法 –

+0

是的,我试过了。但它显示了'self.delegate.fabItemClicked()'上的同样的错误。在添加头类后,是否需要在ProfileVC中设置'delegate = self'。 –