2015-09-16 24 views
0

這是一個兩部分的問題,其中第一個是經過長達一個星期的嘗試來弄清楚這一點,我仍然留下一個空白。我終於讓單個單元格顯示與文本字段中的選擇相關的適當數字,但仍未找出爲什麼要重新加載到tableview中的單元格也顯示更新的文本字段。基本上我只想讓cardCounter的文本字段只在選中的行中更新,然後如果用戶滾動回到原來的位置,如果他們決定刪除它,它會向他們顯示有多少對象可用的計數器。didselectatrow更新下面的多個單元格重新加載tableview +計數器

第二個問題是我試圖爲總數限制爲30的cardCount製作一個計數器,並且對於每個選定的cardCount對象,其中的1個被縮小到29,28,27等等。在我的第一個項目上完成一些小的代碼。

import UIKit 
import CoreData 

class CardSelectionViewController: UIViewController, UITableViewDelegate, UIAlertViewDelegate, UISearchBarDelegate, NSFetchedResultsControllerDelegate { 

var passedDeckObject: Deck? 
let managedObjectContext = (UIApplication.sharedApplication().delegate as! AppDelegate).managedObjectContext 

var deckCardCount = 30 

@IBOutlet weak var cardsListed: UITableView! 

@IBOutlet weak var cardSearch: UISearchBar! 


@IBAction func backButton(sender: AnyObject) { 
} 

@IBAction func saveCardSelection(sender: AnyObject) { 

    if deckCardCount != 30 { 

    let selectmorecards = UIAlertController(title: "Select More Cards", message: "Please Select More Cards To Complete Deck", preferredStyle: .Alert) 
    let okCardAction: UIAlertAction = UIAlertAction(title: "OK", style: .Cancel, handler: nil) 
     selectmorecards.addAction(okCardAction) 
     self.presentViewController(selectmorecards, animated: true, completion: nil) 

    } else { 

    if deckCardCount == 30 { 
    let alertController = UIAlertController(title: "All Cards Correct?", message: "Are all the cards in the deck what you wanted?", preferredStyle: .Alert) 
    let cancelAction: UIAlertAction = UIAlertAction(title: "Cancel", style: .Cancel, handler: nil) 
    let okAction: UIAlertAction = UIAlertAction(title: "OK", style: .Default) { (action) -> Void in 
     self.managedObjectContext?.save(nil) 

     self.presentViewController(alertController, animated: true, completion: nil) 

     } 
     } 
    } 
} 

var costfrc: NSFetchedResultsController! 
var frc: NSFetchedResultsController = NSFetchedResultsController() 
func getFetchedResultsController() -> NSFetchedResultsController { 
    frc = NSFetchedResultsController(fetchRequest: listFetchRequest(), managedObjectContext: managedObjectContext!, sectionNameKeyPath: nil, cacheName: nil) 

    return frc 

} 
func listFetchRequest() -> NSFetchRequest { 

    let requiredClassName = passedDeckObject!.classSelected.classname 
    var requiredCardClasses = [Int]() 
    let fetchRequest = NSFetchRequest(entityName: "Cards") 
    let sortDescriptor = NSSortDescriptor(key: "name", ascending: true) 
    switch(requiredClassName) { 
     case "Warrior": 
     requiredCardClasses = [1,10] 
     case "Shaman": 
     requiredCardClasses = [2,10] 
     case "Rogue": 
     requiredCardClasses = [3,10] 
     case "Paladin": 
     requiredCardClasses = [4,10] 
     case "Hunter": 
     requiredCardClasses = [5,10] 
     case "Druid": 
     requiredCardClasses = [6,10] 
     case "Warlock": 
     requiredCardClasses = [7,10] 
     case "Mage": 
     requiredCardClasses = [8,10] 
     case "Priest": 
     requiredCardClasses = [9,10] 
     default: 
     requiredCardClasses = [10] 
    } 
    fetchRequest.sortDescriptors = [sortDescriptor] 
    fetchRequest.predicate = NSPredicate(format:"cardClass IN %@", requiredCardClasses) 

    return fetchRequest 
} 

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    let numberofRowsInSection = frc.sections?[section].numberOfObjects 
    return numberofRowsInSection! 
} 


//Mark cell displayed with colored text// 
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 

    var cell: firstCardDetails = cardsListed.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as! firstCardDetails 
    let listed = frc.objectAtIndexPath(indexPath) as! Cards 
    var cardCount = 0 
    var myDeckCards: DeckCards? 
    for eachDeckCard in listed.cardselections { 
     let myDeckCard = eachDeckCard as! DeckCards 
     if myDeckCard.cardsstored == passedDeckObject { 
      myDeckCards = eachDeckCard as? DeckCards 
      cardCount = myDeckCards!.numberSelected.integerValue 
     } 
    } 




    cell.cardName?.text = listed.name as String 
    if listed.cardType.isEqualToValue(1) { 
     cell.cardAttack?.text = "*" 
    } else { 
     if listed.cardType.isEqualToValue(2) { 
      cell.cardAttack?.text = "*" 
     } else { 
    cell.cardAttack?.text = listed.attack.stringValue 
    } 
    } 
    if listed.cardType.isEqualToNumber(1) { 
     cell.cardHealth?.text = "*" 
    } else { 
     if listed.cardType.isEqualToValue(2) { 
      cell.cardHealth?.text = "*" 
     } else { 
    cell.cardHealth?.text = listed.health.stringValue 
    } 
    } 
    cell.cardCost?.text = listed.cost.stringValue 

     if listed.cardType.isEqualToNumber(0) { 
      cell.cardType?.text = "Minion" 
     } else { 
      if listed.cardType.isEqualToNumber(1) { 
       cell.cardType?.text = "Spell" 
      } else { 
       if listed.cardType.isEqualToNumber(2) { 
       cell.cardType?.text = "Weapon" 
      } 
      } 
    } 
    if listed.rarity.isEqualToNumber(1) { 
     cell.rarityType?.text = "Legendary" 
     cell.rarityType?.textColor = UIColor.orangeColor() 
    } else { 
     if listed.rarity.isEqualToNumber(2) { 
      cell.rarityType?.text = "Epic" 
      cell.rarityType?.textColor = UIColor.purpleColor() 
     } else { 
      if listed.rarity.isEqualToNumber(3) { 
       cell.rarityType?.text = "Rare" 
       cell.rarityType?.textColor = UIColor.blueColor() 
      } else { 
       if listed.rarity.isEqualToNumber(4) { 
        cell.rarityType?.text = "Common" 
        cell.rarityType?.textColor = UIColor.grayColor() 
       } else { 
        if listed.rarity.isEqualToNumber(5) { 
         cell.rarityType?.text = "Starter" 
         cell.rarityType?.textColor = UIColor.blackColor() 
        } 
       } 
      } 
     } 
    } 
    if listed.cardClass.isEqualToNumber(1) { 
     cell.cardName?.textColor = UIColor(red: 0xbe/255, green: 0x23/255, blue: 0x0f/255, alpha: 1.0) 
    } else { 
     if listed.cardClass.isEqualToNumber(2) { 
      cell.cardName?.textColor = UIColor.blueColor() 
     } else { 
      if listed.cardClass.isEqualToNumber(3) { 
       cell.cardName?.textColor = UIColor(red: 0xE2/255, green: 0xA8/255, blue: 0x79/255, alpha: 1.0) 
      } else { 
       if listed.cardClass.isEqualToNumber(4) { 
        cell.cardName?.textColor = UIColor(red: 0xFF/255, green: 0xAA/255, blue: 0x00/255, alpha: 1.0) 
       } else { 
        if listed.cardClass.isEqualToNumber(5) { 
         cell.cardName?.textColor = UIColor(red: 0x22/255, green: 0x63/255, blue: 0x29/255, alpha: 1.0) 
        } else { 
         if listed.cardClass.isEqualToNumber(6) { 
          cell.cardName?.textColor = UIColor.brownColor() 
         } else { 
          if listed.cardClass.isEqualToNumber(7) { 
           cell.cardName?.textColor = UIColor(red: 0xBB/255, green: 0x76/255, blue: 0xE4/255, alpha: 1.0) 
          } else { 
           if listed.cardClass.isEqualToNumber(8) { 
            cell.cardName?.textColor = UIColor(red: 0x9E/255, green: 0xB5/255, blue: 0xFF/255, alpha: 1.0) 
           } else { 
            if listed.cardClass.isEqualToNumber(9) { 
             cell.cardName?.textColor = UIColor.grayColor() 
            } else { 
             if listed.cardClass.isEqualToNumber(10) { 
              cell.cardName?.textColor = UIColor.blackColor() 
             } 
             } 
           } 
          } 

          } 
         } 
        } 
       } 
     } 
    } 
    return cell 
} 
//reload content// 
func controllerDidChangeContent(controller: NSFetchedResultsController) { 
    cardsListed.reloadData() 
} 


//selected row functions// 
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) { 
    var cardCount = 0 
    var myDeckCards: DeckCards? 
    let listed = frc.objectAtIndexPath(indexPath) as! Cards 


    var cell = cardsListed.cellForRowAtIndexPath(indexPath) as! firstCardDetails 

    cell.indexOfAccessibilityElement(listed) 

    // check: is there already a DeckCards object for this Card and this Deck? 
    let deckCardsSet = listed.cardselections 
    println("The set of DeckCards for that Card is \(deckCardsSet.count)") 
    for eachDeckCard in listed.cardselections { 
     let myDeckCard = eachDeckCard as! DeckCards 
     if myDeckCard.cardsstored == passedDeckObject { 
      // There is already a DeckCard object for this Card and currentDeck 
      myDeckCards = eachDeckCard as? DeckCards 
     } 
    } 
    if myDeckCards == nil { 
     // There is no DeckCard object for this Card and currentDeck 
     // So create one... 
     myDeckCards = NSEntityDescription.insertNewObjectForEntityForName("DeckCards", inManagedObjectContext: managedObjectContext!) as? DeckCards 
     myDeckCards!.cardsselected = listed 
     myDeckCards!.cardsstored = passedDeckObject! 
    } 
    // your code to determine numberSelected here; I'll assume 2! 
    cardCount = myDeckCards!.numberSelected.integerValue 
    deckCardCount = myDeckCards!.deckcardCount.integerValue 


    cardCount = cardCount == 2 ? 0 : cardCount + 1 
    myDeckCards!.numberSelected = cardCount 
    deckCardCount = deckCardCount - cardCount 
    cell.cardCounter.text = " " + cardCount.description 
     if deckCardCount == 30 { 
      if cell.selected { 
       deckCardCount = deckCardCount + 1 
      } 
     myDeckCards!.numberSelected = deckCardCount 
     myDeckCards!.numberSelected = cardCount 
     } 
    println(deckCardCount) 
    println(cardCount) 

} 

//searchBar contoller// 
func searchBar(searchBar: UISearchBar, textDidChange searchText: String) { 

    searchBar.setShowsCancelButton(true, animated: true) 
    let requiredClassName = passedDeckObject!.classSelected.classname 
    var requiredCardClasses = [Int]() 
    switch(requiredClassName) { 
    case "Warrior": 
     requiredCardClasses = [1,10] 
    case "Shaman": 
     requiredCardClasses = [2,10] 
    case "Rogue": 
     requiredCardClasses = [3,10] 
    case "Paladin": 
     requiredCardClasses = [4,10] 
    case "Hunter": 
     requiredCardClasses = [5,10] 
    case "Druid": 
     requiredCardClasses = [6,10] 
    case "Warlock": 
     requiredCardClasses = [7,10] 
    case "Mage": 
     requiredCardClasses = [8,10] 
    case "Priest": 
     requiredCardClasses = [9,10] 
    default: 
     requiredCardClasses = [10] 
    } 
    if !searchText.isEmpty { 
     // Clear out the fetchedResultController 
     frc = getFetchedResultsController() 
     // Setup the fetch request 
     let fetchRequest = NSFetchRequest(entityName: "Cards") 
     fetchRequest.fetchLimit = 565 
     fetchRequest.predicate = NSCompoundPredicate(type: .AndPredicateType, subpredicates: [NSPredicate(format: "name contains[cd] %@", searchText), NSPredicate(format: "cardClass IN %@", requiredCardClasses)]) 
     let sortDescriptor = NSSortDescriptor(key: "name", ascending: true) 
     fetchRequest.sortDescriptors = [sortDescriptor] 
     println(fetchRequest.predicate) 
     //end// 
     //cost fetch request begins here// 
     let costfetchRequest = NSFetchRequest(entityName: "cardCost") 
     costfetchRequest.fetchLimit = 565 
     costfetchRequest.predicate = NSPredicate(format: "cardCost = %i", searchText) 
     let costSortDescriptor = NSSortDescriptor(key: "cardCost", ascending: true) 
     costfetchRequest.sortDescriptors = [sortDescriptor] 
     //end// 

     // Pass the fetchRequest and the context as parameters to the fetchedResultController 
     frc = NSFetchedResultsController(fetchRequest: fetchRequest, managedObjectContext:managedObjectContext!, 
      sectionNameKeyPath: nil, cacheName: nil) 
     // Make the fetchedResultController a delegate of the MoviesViewController class 
     frc.delegate = self 
     // Execute the fetch request or display an error message in the Debugger console 
     var error: NSError? = nil 
     if (!frc.performFetch(&error)) { 
      println("Error: \(error?.localizedDescription)") 
     } 
     // Refresh the table view to show search results 
     cardsListed.reloadData() 
    } 
} 
//search Cancel 
func searchBarCancelButtonClicked(searchBar: UISearchBar) { 
    searchBar.text = nil 
    searchBar.showsCancelButton = false // Hide the cancel 
    searchBar.resignFirstResponder() // Hide the keyboard 

    // Refresh the table view to show fetchedResultController results 
    cardsListed.reloadData() 
} 
override func touchesBegan(touches: Set<NSObject>, withEvent event: UIEvent) { 

    self.view.endEditing(true) 
} 
func textFieldShouldReturn(textField: UITextField) -> Bool { 

    textField.resignFirstResponder() 
    return true 
} 

override func viewDidLoad() { 
    super.viewDidLoad() 

    println(passedDeckObject?.deckname) 
    var nib = UINib(nibName: "firstCardDetails", bundle: nil) 
    cardsListed.registerNib(nib, forCellReuseIdentifier: "cell") 
    frc = getFetchedResultsController() 
    frc.delegate = self 
    frc.performFetch(nil) 


} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
} 
+0

你有很多如果其他人在那裏!我會建議使用一個開關來控制流量。例如'switch(listed.cardClass){case 1:... case 2:...'等 –

+0

啊是的,我在其他視圖控制器中使用開關,但這是我的項目的早期部分之一,因此我避難還沒有時間把它全部轉換。有關相關問題的任何想法,但? – cruelty

回答

0

對於問題#1 ....

它通常是一個壞主意,當你使用可重複使用的細胞製造的cellForRowAtIndexPath(或prepareForReuse)以外的細胞變化。有一些例外,但大多數情況下,這是安全的選擇。最好的策略是在其他方法中更改只有,然後重新加載受影響的單元(或全部)。

由於單元格已被緩存,因此每當使用單元格時,您對單元格所做的更改都會顯示在屏幕上,除非您在返回單元格時顯式覆蓋更改。

didSelectRowAtIndexPath方法中,您應該計算所需並將其存儲在某個位置,然後在cellForRowAtIndexPath中更新其顯示。

+0

我看到嗯我試圖在cellforRowatindexpath區域更改單元格更改,但我得到的結果是,即使使用索引路徑設置它,也會改變所有更改單元格下方的單元格 – cruelty

+0

我想這取決於** how * *完成了。有時候,人們會編寫如下代碼:'if(x){cell.field.text = @「something」;}'忘記擁有'else',這意味着(!x)的情況具有先前在單元格中的任何內容。也許這樣的事情? –

+0

我嘗試了一個if else語句以及一個開關同樣的事情不斷髮生我完全失去了這一點,我覺得它與核心數據有關我以前的方式是這樣的東西我把卡片數還有'if cardcount == 0 {cell.cardCounter.text = cardCount.description} else {if cardCount == 1 {cell.cardCounter.text = cardCount.description} else {if cardCount == 2 { cell.cardCounter.text = cardCount.description}' – cruelty

相關問題