2017-10-19 20 views
0

Hey, je suis nouveau à la programmation et mon problème est, j'ai un UICollectionViewController avec 4 cellules qui sont scrollable horizontal. A l'intérieur de la 4ème cellule, j'ai un UIButton (optionsButton) sur un UIView (ProfileContainerView).Comment présenter un ViewController après avoir appuyé sur un bouton à l'intérieur d'un CollectionViewCell

Le UIViewController Je souhaite présenter est appelé ProfileEditViewController et est mis en place dans Main.storyboard.

Comment puis-je présenter un UIViewController après avoir appuyé sur ce bouton?

ProfileCell:

class ProfileCell: UICollectionViewCell { 

    let profileContainerView: UIView = { 
     let view = UIView() 
     return view 
    }() 

    lazy var optionsButton: UIButton = { 
     let btn = UIButton(type: .custom) 
     btn.setImage(#imageLiteral(resourceName: "Settings"), for: UIControlState.normal) 
     btn.addTarget(self, action: #selector(handleOptionsButton), for: UIControlEvents.touchUpInside) 
     return btn 
    }() 

    @objc func handleOptionsButton() { 
     print("Button pressed") 
    } 
} 

HomeViewController:

class HomeViewController: UICollectionViewController, UICollectionViewDelegateFlowLayout { 


    let profileCelId = "profileCell" 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     setupSwipeView() 
    } 


    func setupSwipeView() { 
     collectionView?.register(UICollectionViewCell.self, forCellWithReuseIdentifier: cell) 
     collectionView?.register(ProfileCell.self, forCellWithReuseIdentifier: profileCelId)   
    } 


    override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {   
     if indexPath.item == 3 { 
      return collectionView.dequeueReusableCell(withReuseIdentifier: profileCelId, for: indexPath) 
     } 
     return cell 
    } 
} 
+0

Vérifiez ceci: https://stackoverflow.com/questions/43766963/swift-action-button-inside-a-collectionviewcell – Amit

Répondre

0

Vous pouvez présenter votre ProfileEditViewController, qui est de style dans votre Main.storyboard la manière suivante:

1) Donnez votre ProfileEditViewController un StoryBoard ID. Par exemple. « ProfileEditViewController » - Certaines questions concernant c'est ici: What is a StoryBoard ID and how can i use this?

2) Enregistrez le UIViewController pour l'action sur le UIButton ou offrir une fonctionnalité de rappel appropriée. Comme votre HomeViewController est aussi votre source de données de collection Voir, vous pouvez facilement étendre votre méthode DataSource

func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell` 

mise en œuvre pourrait ressembler à:

override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {   
    if indexPath.item == 3 { 
     let profileCell = collectionView.dequeueReusableCell(withReuseIdentifier: profileCelId, for: indexPath) 
     if let _cell = cell as? ProfileCell, 
      let button = _cell.optionsButton as? UIButton { 
      button.addTarget(self, action: #selector(handleOptionsButton), forControlEvents: UIControlEvents.TouchUpInside) 
     } 
     return profileCell; 
    } 
    return cell 
} 

Assurez-vous que les boutons d'action est actuellement mis en œuvre également par votre HomeViewController

@objc func handleOptionsButton() { 
    print("Button pressed") 
} 

3) maintenant, en HomeViewController.handleOptionsButton vous devez prov ide une fonctionnalité pour prendre en charge la transition vers ce contrôleur spécifique avec le StoryboardID souhaité:

let storyboard = UIStoryboard(name: "Main", bundle:Bundle.main) 
let controller = storyboard.instantiateViewController(withIdentifier: "ProfileEditViewController") 
self.present(controller, animated: true, completion: nil) 
+0

J'ai essayé mais cela montre que la valeur de type 'Profil Cell 'n'a aucun membre' présent ' – Sam

+0

present est une fonction implémentée par 'UIViewControllers' voir ici: https://developer.apple.com/documentation/uikit/uiviewcontroller/1621380-present. Vous pouvez enregistrer votre UIViewController pour l'action de l'Uibutton par exemple. Je vais ajuster ma réponse. – Lepidopteron

+1

Ok, je vais essayer et vous dire si cela a fonctionné.Merci pour votre temps – Sam

1

Vous pouvez utiliser des délégués pour l'implémenter.

Ci-dessous est le code pour mettre en œuvre cette

protocol ProfileCollectionViewCellDelegate { 
func buttonPressedAtIndexPath(inCell: ProfileCell) 
} 

class ProfileCell: UICollectionViewCell { 

var delegate : ProfileCollectionViewCellDelegate? 
let profileContainerView: UIView = { 
    let view = UIView() 
    return view 
}() 

lazy var optionsButton: UIButton = { 
    let btn = UIButton(type: .custom) 
    btn.setImage(#imageLiteral(resourceName: "Settings"), for: UIControlState.normal) 
    btn.addTarget(self, action: #selector(handleOptionsButton), for: UIControlEvents.touchUpInside) 
    return btn 
}() 

@objc func handleOptionsButton() { 
    if self.delegate != nil { 
     self.delegate?.buttonPressedAtIndexPath(self) 
    } 
} 
} 

Pour votre HomeViewController

class HomeViewController: UICollectionViewController, UICollectionViewDelegateFlowLayout, ProfileCollectionViewCellDelegate { 


let profileCelId = "profileCell" 

override func viewDidLoad() { 
    super.viewDidLoad() 
    setupSwipeView() 
} 


func setupSwipeView() { 
    collectionView?.register(UICollectionViewCell.self, forCellWithReuseIdentifier: cell) 
    collectionView?.register(ProfileCell.self, forCellWithReuseIdentifier: profileCelId)   
} 


    override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell {   

    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: profileCelId, for: indexPath) 
    cell.delegate = self 
    return cell 
} 

fun buttonPressedAtIndexPath(inCell: ProfileCell) { 
     let indexOfCell = self.collectionView.indexPath(for: cell) 
     if indexOfCell.row == 3 { 
      //Do your work here 
     } 

} 

} 
+0

Merci pour votre réponse, je vais essayer que – Sam

+0

Frank avez-vous essayé? –

+0

Désolé je n'ai pas remarqué que vous m'avez écrit – Sam

0

laisser PROCELL = ProfileCell()

override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell { 
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: self.cell, for: indexPath) 
    if indexPath.item == 3 { 
     let profileCell = collectionView.dequeueReusableCell(withReuseIdentifier: profileCelId, for: indexPath) 
     let button = proCell.optionsButton 
      button.addTarget(self, action: #selector(handleOptionsButton), for: UIControlEvents.touchUpInside) 
     return profileCell; 
    } 
    return cell 
}