2016-08-14 145 views
1

我有一个3个部分的collectionView和一个标题上的按钮来删除每个部分。我写了我的代码,但我一直得到这个错误:删除按钮无法正常工作,收集查看

fatal error: Index out of range (lldb)

但我不知道发生了什么事?为什么它不工作。

这是我的代码:

//Global Identifier 
private let cellIdentifier = "ImageCell" 
private let headerIdentifier = "Header" 


class ViewController: UICollectionViewController { 

//Data Models 

//Image Arrays 
var fireImages: [UIImage] = [ 
    UIImage(named: "charizard")!, 
    UIImage(named: "ninetails")!, 
    UIImage(named: "arcanine")!, 
    UIImage(named: "rapidash")!, 
    UIImage(named: "magmar")!, 
    UIImage(named: "flareon")! 
] 

var waterImages: [UIImage] = [ 
    UIImage(named: "blastoise")!, 
    UIImage(named: "golduck")!, 
    UIImage(named: "cloyster")!, 
    UIImage(named: "goldeen")!, 
    UIImage(named: "magikarp")!, 
    UIImage(named: "vaporeon")! 
] 

var electricImages: [UIImage] = [ 
    UIImage(named: "pikachu")!, 
    UIImage(named: "magneton")!, 
    UIImage(named: "zapdos")!, 
    UIImage(named: "electabuzz")!, 
    UIImage(named: "raichu")!, 
    UIImage(named: "jolteon")! 
] 

//Name Arrays 
var fireNames = ["Charizard", "Ninetales", "Arcanine", "Rapidash", "Magmar", "Flareon"] 

var waterNames = ["Blastoise", "Golduck", "Cloyster", "Goldeen", "Magikarp", "Vaporeon"] 

var electricNames = ["Pikachu", "Magneton", "Zapdos", "Electrabuzz", "Raichu", "Jolteon"] 

//Sections 
var sectionTitle = ["Fire Types", "Water Types", "Electric Types"] 


//-------------------------------- 

    override func viewDidLoad() { 
    super.viewDidLoad() 
    // Do any additional setup after loading the view, typically from a nib. 
} 

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

//-------------------------------- 


//MARK: - UICollectionViewDataSource 

//Number of Sections 
override func numberOfSectionsInCollectionView(collectionView: UICollectionView) -> Int { 
    return sectionTitle.count 
} 

//Number of Cells in each Section 
override func collectionView(collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int { 
//How can I dynamically code this area? 
    return 6 
} 

//Header Configuration 
override func collectionView(collectionView: UICollectionView, viewForSupplementaryElementOfKind kind: String, atIndexPath indexPath: NSIndexPath) -> UICollectionReusableView { 

    if indexPath.section == 0 { 

     //Fire Type header 
    let header = collectionView.dequeueReusableSupplementaryViewOfKind(UICollectionElementKindSectionHeader, withReuseIdentifier: headerIdentifier, forIndexPath: indexPath) as! CollectionReusableView 

     header.headerTitle.text = sectionTitle[indexPath.section] 
     header.backgroundColor = UIColor.orangeColor() 
     header.deleteButton.tag = indexPath.section 

     return header 

    } else if indexPath.section == 1 { 

     //Water Type header 
     let header = collectionView.dequeueReusableSupplementaryViewOfKind(UICollectionElementKindSectionHeader, withReuseIdentifier: headerIdentifier, forIndexPath: indexPath) as! CollectionReusableView 

     header.headerTitle.text = sectionTitle[indexPath.section] 
     header.backgroundColor = UIColor.cyanColor() 
     header.deleteButton.tag = indexPath.section 

     return header 

    } else { 

     //Electric Type header 
     let header = collectionView.dequeueReusableSupplementaryViewOfKind(UICollectionElementKindSectionHeader, withReuseIdentifier: headerIdentifier, forIndexPath: indexPath) as! CollectionReusableView 

     header.headerTitle.text = sectionTitle[indexPath.section] 
     header.backgroundColor = UIColor.yellowColor() 
     header.deleteButton.tag = indexPath.section 

     return header 

    } 

} 

//Cell Configuration 
override func collectionView(collectionView: UICollectionView, cellForItemAtIndexPath indexPath: NSIndexPath) -> UICollectionViewCell { 

    if indexPath.section == 0 { 

     //Fire Type cells 
     let cell = collectionView.dequeueReusableCellWithReuseIdentifier(cellIdentifier, forIndexPath: indexPath) as! CollectionViewCell 

     cell.pokemonImage.image = fireImages[indexPath.row] 
     cell.pokemonLabel.text = fireNames[indexPath.row] 


    return cell 

    } else if indexPath.section == 1 { 

     //Water Type cells 
     let cell = collectionView.dequeueReusableCellWithReuseIdentifier(cellIdentifier, forIndexPath: indexPath) as! CollectionViewCell 

     cell.pokemonImage.image = waterImages[indexPath.row] 
     cell.pokemonLabel.text = waterNames[indexPath.row] 

     return cell 

    } else { 

     //Electric Type cells 
     let cell = collectionView.dequeueReusableCellWithReuseIdentifier(cellIdentifier, forIndexPath: indexPath) as! CollectionViewCell 

     cell.pokemonImage.image = electricImages[indexPath.row] 
     cell.pokemonLabel.text = electricNames[indexPath.row] 

     return cell 

    } 

} 

//Delete Section Button 
@IBAction func deleteSectionButton(sender: UIButton) { 

    //Section tag 
    let section = sender.tag 

    if section == 0 { 

    //Update data model 
    fireImages.removeAtIndex(section) 
    fireNames.removeAtIndex(section) 
    sectionTitle.removeAtIndex(section) 

    //Action 
    collectionView?.performBatchUpdates({ 
     self.collectionView?.deleteSections(NSIndexSet(index: section)) 
     }, 
     completion: { (finished) in 
      if finished { 
       self.collectionView!.reloadData() 
      } 
     }) 

    } else if section == 1 { 

     //Update data model 
     waterImages.removeAtIndex(section) 
     waterNames.removeAtIndex(section) 
     sectionTitle.removeAtIndex(section) 

     //Action 
     collectionView?.performBatchUpdates({ 
      self.collectionView?.deleteSections(NSIndexSet(index: section)) 
      }, 
      completion: { (finished) in 
       if finished { 
        self.collectionView!.reloadData() 
       } 
     }) 

    } else { 

     //Update data model 
     electricImages.removeAtIndex(section) 
     electricNames.removeAtIndex(section) 
     sectionTitle.removeAtIndex(section) 

     //Action 
     collectionView?.performBatchUpdates({ 
      self.collectionView?.deleteSections(NSIndexSet(index: section)) 
      }, 
      completion: { (finished) in 
      if finished { 
       self.collectionView!.reloadData() 
      } 
     }) 

    } 

} 

} 

它也向我展示这一点。所有的

enter image description here

+0

我对集合视图了解不多,但是看起来您已经将3个部分硬编码到每个collectionView中,即使您已经删除了一个集合视图。 – Shades

+0

如何动态编码我的'numberOfItemsInSection'覆盖?它现在说6 6 – art3mis

+0

我想你想改变numberOfSectionsInCollectionView。而不是3,请使用sectionTitle.count,当您删除某个节时,请从数组中删除其标题。当然,因为我自己从来没有用过它,所以我可以走了。 – Shades

回答

1

首先,你的代码是没有像面向对象的。这里有一些问题:

  1. 你必须在一节电池的硬编码数:。你将如何处理案例口袋妖怪类的类型有不同数量的口袋妖怪?
  2. 你的代码有许多重复,必须避免。有很多if section ==控件;这是避免面向对象原则的明确指标。

无论如何;因为你有比非工作删除按钮更大的问题;我决定为您设置一个干净的项目,以说明如何以更加面向对象的方式来处理问题。我创建了诸如Pokemon和PokemonClass这样的域实体,并在这些实体中存储了相应的属性。通过这种方式;我避免了控制器类中存在的许多代码重复。我也已经说明了如何让删除按钮起作用(顺便说一下,确实有更好的方法来处理这个删除部分的功能;但是我没有足够的时间来搜索它,而且我是第一个这样做的在我心里)。由于时间限制,我没有再次处理小宠物的图像。无论如何;看看我在我的github repository上共享的源代码。你可以询问你有任何问题,你当然可以免费使用我提供的任何代码。希望这会帮助你开始以OO方式进行设计。