不调用UiCollectionView的didSelectItemAtIndexPath

时间:2016-09-13 15:33:08

标签: ios swift uicollectionview

经过几天的疯狂,我无法找到解决问题的方法。问题是:在UICollectionView中选择单元格后,方法didSelectItemAtIndexPath未被调用。

我的观点结构是:

Views structure

此视图由具有以下方法的控制器管理:

override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(animated)
}

override func viewDidLoad() {
    super.viewDidLoad()

    initCategoriesCollection()

    // Do any additional setup after loading the view.
}

override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

func initCategoriesCollection(){
    let ccVC : CategoriesCollectionViewController  =  UIStoryboard(name:"CandidateProfile",bundle:nil).instantiateViewControllerWithIdentifier("categoriesController") as! CategoriesCollectionViewController;
    addChildViewController(ccVC)
    ccVC.view.frame = CGRectMake(0, 0, self.containerView.frame.size.width, self.containerView.frame.size.height);
    containerView.addSubview(ccVC.view)

    ccVC.didMoveToParentViewController(self)

}    

上面的容器视图具有以下结构:

enter image description here

此容器视图由实现这些方法的ViewController管理:

// tell the collection view how many cells to make
func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
    return self.e1Categories.count
}

// make a cell for each cell index path
func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell {

    // get a reference to our storyboard cell
    let cell = collectionView.dequeueReusableCellWithReuseIdentifier(reuseIdentifier, forIndexPath: indexPath) as! CategoryCollectionViewCell

    // Use the outlet in our custom class to get a reference to the UILabel in the cell
    cell.categoryName.text = self.e1Categories[indexPath.item].string
    cell.categoryName.numberOfLines = 0
    cell.categoryName.sizeToFit()
    cell.categoryName.textAlignment = .Center
    cell.categoryCircle.makeCircle()

    return cell
}

// MARK: - UICollectionViewDelegate protocol

func collectionView(collectionView: UICollectionView, didSelectItemAtIndexPath indexPath: NSIndexPath) {
    // handle tap events
    print("You selected cell #\(indexPath.item)!")
}

有谁知道发生了什么?我试图删除ScrollView,因为它可能是拦截触摸事件,但它仍然无法正常工作。 在阅读了其他一些问题之后,在Stackoverflow中,没有一个问题可以解决。

提前致谢。

编辑:

我已将delegatedataSource与故事板相关联,如下图所示:

enter image description here

3 个答案:

答案 0 :(得分:1)

@if (MethodCallThatReturnsBool()) { System.Web.HttpContext.Current.Response.Write(System.Web.Optimization.Styles.Render("~/css/bundle")); } ,您正在创建新的initCategoriesCollection()

CategoriesCollectionViewController

据你说:

  

此容器视图由实现这些方法的ViewController管理:

然后,您将let ccVC : CategoriesCollectionViewController = UIStoryboard(name:"CandidateProfile",bundle:nil).instantiateViewControllerWithIdentifier("categoriesController") as! CategoriesCollectionViewController; 添加到实施ccVC功能controller的其他delegate。因此,故事板上设置的didSelectItemAtIndexPath不是正确管理它的delegate

您应该更新controller,因为您要将其添加到正在实施它的另一个delegate。尝试更新到此

controller

答案 1 :(得分:0)

首先,谢谢你给我一些解决问题的提示。跟随它们并尝试将父控制器指定为delegate的{​​{1}},它表示子ViewController中没有ccvc.collectionView。 我的问题是,我认为如果通过delegate分配delegatedataSource它会有效,但不会。

所以我决定在父控制器中实现Delegate和Datasource协议,删除子控制器,它现在就像魅力一样。 当我使用Storyboard时,也许我误解了概念。谢谢你的帮助!

答案 2 :(得分:0)

collectionView.delegate = self
collectionView.dataSource = self

设置委托和数据源UIViewController类,而不是在故事板中