2016-08-26 2 views
0

나는 뒤집힌 셀이있는 테이블 뷰를 만들었고, 나는 이것을 tutorial; segue 메서드를 제외하고 모든 것이 훌륭하게 작동합니다. 나는 단순히 performsegueWithIdentifier 방법 (셀에 의해 스토리 보드에서 SEGUE 추가)를 추가하려고"붕괴 된"셀의 세그먼트가 튀어 나옴

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) 
    {   
     performSegueWithIdentifier("toChantController", sender: self) 
    } 

prepareForSegue 방법 :

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) 
    { 
     if segue.identifier == "toChantController" 
     { 
      let indexPath = tableView.indexPathForCell(sender as! UITableViewCell) 
      let controller = segue.destinationViewController as! ChantViewController 
      controller.chant = "\(sections[indexPath!.row])" 
     } 
    } 

하지만, 엑스 코드는

"Could not cast value of type 'iSupporters.TeamChantViewController' (0x104562730) to 'UITableViewCell' (0x106600540)."

다음 날이 오류를 보냅니다 내 전체 수업 :

import UIKit 

class TeamChantViewController: UIViewController, UITableViewDataSource, UITableViewDelegate 
{ 
    // MARK: properties 

    var teamChants: TeamModel! 
    @IBOutlet weak var tableView: UITableView! 

    struct Section { 
     var name: String! 
     var items: [String]! 
     var collapsed: Bool! 

     init(name: String, items: [String], collapsed: Bool = true) { 
      self.name = name 
      self.items = items 
      self.collapsed = collapsed 
     } 
    } 

    var sections = [Section]() 

    override func viewDidLoad() 
    { 
     super.viewDidLoad() 

     tableView.backgroundColor = UIColor.clearColor() 
     tableView.separatorColor = UIColor.clearColor() 

     sections = [ 
      Section(name: "Juventus", items: ["Olè", "fino alla fine", "ovunque voi giocate", "juve olè"]), 
      Section(name: "Derby", items: ["toro merda", "odio i granata", "il viola è il colore che odio"]), 
      Section(name: "Giocatori", items: ["Vidal", "Pogba", "Del Piero"]) 
     ] 
    } 

    override func viewWillAppear(animated: Bool) 
    { 
     super.viewWillAppear(animated) 
     self.tabBarController?.tabBar.hidden = true 
    } 

    // MARK: collection view data source and delegate 

    func numberOfSectionsInTableView(tableView: UITableView) -> Int 
    { 
     return 1 
    } 

    func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
    { 
     var count = sections.count 

     for section in sections 
     { 
      count += section.items.count 
     } 

     return count 
    } 

    func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat 
    { 
     let section = getSectionIndex(indexPath.row) 
     let row = getRowIndex(indexPath.row) 

     if row == 0 { 
      return 50.0 
     } 

     return sections[section].collapsed! ? 0 : 44.0 
    } 

    func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 
    { 
     let section = getSectionIndex(indexPath.row) 
     let row = getRowIndex(indexPath.row) 

     if row == 0 
     { 
      let cell = tableView.dequeueReusableCellWithIdentifier("teamChantsHeader") as! TeamChantsHeader 
      cell.teamChantSectionTitle.text = sections[section].name 
      cell.toggleButton.tag = section 
      cell.toggleButton.setTitle(sections[section].collapsed! ? "+" : "-", forState: .Normal) 
      cell.toggleButton.addTarget(self, action: #selector(TeamChantViewController.toggleCollapse), forControlEvents: .TouchUpInside) 

      return cell 
     } else { 
      let cell = tableView.dequeueReusableCellWithIdentifier("teamChantsCell") as UITableViewCell! 
      cell.textLabel?.text = sections[section].items[row - 1] 

      return cell 
     } 
    } 

    func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) 
    { 
     performSegueWithIdentifier("toChantController", sender: self) 
     print(self) 
    } 

    // MARK: navigation (segue) 

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) 
    { 
     if segue.identifier == "toChantController" 
     { 
      let indexPath = tableView.indexPathForCell(sender as! UITableViewCell) 
      let controller = segue.destinationViewController as! ChantViewController 
      controller.chant = "\(sections[indexPath!.row])" 
     } 
    } 

    // MARK: - other methods 

    func toggleCollapse(sender: UIButton) 
    { 
     let section = sender.tag 
     let collapsed = sections[section].collapsed 

     // Toggle collapse 
     sections[section].collapsed = !collapsed 

     let indices = getHeaderIndices() 

     let start = indices[section] 
     let end = start + sections[section].items.count 

     tableView.beginUpdates() 
     for i in start ..< end + 1 
     { 
      tableView.reloadRowsAtIndexPaths([NSIndexPath(forRow: i, inSection: 0)], withRowAnimation: .Automatic) 
     } 
     tableView.endUpdates() 
    } 

    func getSectionIndex(row: NSInteger) -> Int 
    { 
     let indices = getHeaderIndices() 

     for i in 0..<indices.count 
     { 
      if i == indices.count - 1 || row < indices[i + 1] 
      { 
       return i 
      } 
     } 

     return -1 
    } 

    func getRowIndex(row: NSInteger) -> Int 
    { 
     var index = row 
     let indices = getHeaderIndices() 

     for i in 0..<indices.count 
     { 
      if i == indices.count - 1 || row < indices[i + 1] 
      { 
       index -= indices[i] 
       break 
      } 
     } 

     return index 
    } 

    func getHeaderIndices() -> [Int] 
    { 
     var index = 0 
     var indices: [Int] = [] 

     for section in sections 
     { 
      indices.append(index) 
      index += section.items.count + 1 
     } 

     return indices 
    } 
} 

누구든지이 세그먼트를 수행하는 데 도움이 될 수 있습니까?

편집 : 스토리 보드 enter image description here

답변

0

내 SEGUE 당신은 UITableViewCellChantViewController까지 stroyboard 여기에 두 가지,

  • 먼저 만든 SEGUE을 다하고 있습니다.
  • didSelectRowAtIndexPathself을 다시 전달하고 TeamChantViewController의 참조로 segue를 다시 수행하고 있습니다.

문제를 해결하려면 한 가지를 변경해야합니다.

편집 : 귀하의 코멘트에서는이 같은 performSegue 방법에 sender 매개 변수를 indexPath 객체를 전달하고 prePareForSegue 방법이 indexPath를 얻을 필요가있다.

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {   
    performSegueWithIdentifier("toChantController", sender: indexPath) 
} 

override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) { 
    if segue.identifier == "toChantController" 
    { 
     let indexPath = sender as! NSIndexPath 
     let controller = segue.destinationViewController as! ChantViewController 
     controller.chant = "\(sections[indexPath!.row])" 
    } 
} 
+0

죄송합니다. 잘못된 것입니다. TeamChantViewController의 Segue를 셀이 아닌 ChantViewController로 설정했습니다. 하지만 Xcode는 나에게 같은 오류를 보냅니다. 그래서 performSegue (셀에 의해 SB에서 segue 만들기)를 삭제하려고 시도했지만 prepareSegue는 작동하지만 indexPath 상수가 범위를 벗어납니다. indexPath에 문제가있는 것입니다 ... –

+0

@FabioCenni 더 많은 도움이 될 segue를 선택한 후 스토리 보드의 이미지를 표시 할 수 있습니까? –

+0

방금 ​​추가되었습니다! 나는 스토리 보드에서 Seagues를 TeamChantViewController에서 ChantViewController로 만들었습니다. 또한 셀에서 segue 메소드를 삭제하려고했으나 인덱스 경로가 범위를 벗어나는 문제가 있습니다 ... –

관련 문제