2017-05-01 1 views
0

cellForRowAt 아래의 cb.check (self.rowChecked [indexPath.row]) 행에 "LolFirstTableViewController '유형의 값이'rowChecked '멤버가 없습니다. rowChecked를 tasks.count 항목 수가있는 부울 배열로 설정했지만. 내가 cellForRowAt 이외의 곳에서 rowChecked를 초기화해야합니까, 아니면 여기서 뭘 잘못하고 있습니까? 이 코드의 요점은 테이블의 각 셀에 확인란을 표시하여 액세서리를 체크 표시로 변경하고 클릭하여 체크 표시를 해제 할 수있게하는 것입니다. 이 확인란 자체는 CheckButton이라는 별도의 사용자 정의 클래스입니다. 나는 아직도 스위프트를 배우고있어 어떤 도움을 주시면 대단히 감사하겠습니다! 고맙습니다!'_'유형의 값이 구성원이 없습니다.

import UIKit 

class LoLFirstTableViewController: UITableViewController { 

    var tasks:[Task] = taskData 

    override func viewDidLoad() { 
     super.viewDidLoad() 
     tableView.rowHeight = UITableViewAutomaticDimension 
     tableView.estimatedRowHeight = 60.0 
    } 

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

    override func numberOfSections(in tableView: UITableView) -> Int { 
     return 1 
    } 

    override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
     return tasks.count 
    } 

    @IBAction func cancelToLoLFirstTableViewController(_ segue:UIStoryboardSegue) { 
    } 

    @IBAction func saveAddTask(_ segue:UIStoryboardSegue) { 
     if let AddTaskTableViewController = segue.source as? AddTaskTableViewController { 

      if let task = AddTaskTableViewController.task { 
       tasks.append(task) 

       let indexPath = IndexPath(row: tasks.count-1, section: 0) 
       tableView.insertRows(at: [indexPath], with: .automatic) 
      } 
     } 
    } 

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCell(withIdentifier: "TaskCell", for: indexPath) as! TaskCell 

    let task = tasks[indexPath.row] 
     cell.task = task 

     var rowChecked: [Bool] = Array(repeating: false, count: tasks.count) 

    if cell.accessoryView == nil { 
       let cb = CheckButton() 
       cb.addTarget(self, action: #selector(buttonTapped(_:forEvent:)), for: .touchUpInside) 
       cell.accessoryView = cb 
    } 
      let cb = cell.accessoryView as! CheckButton 
      cb.check(self.rowChecked[indexPath.row]) 

      return cell 
    } 

func buttonTapped(_ target:UIButton, forEvent event: UIEvent) { 
      guard let touch = event.allTouches?.first else { return } 
      let point = touch.location(in: self.tableView) 
      let indexPath = self.tableView.indexPathForRow(at: point) 
     var tappedItem = tasks[indexPath!.row] as Task 
     tappedItem.completed = !tappedItem.completed 
     tasks[indexPath!.row] = tappedItem 
      tableView.reloadRows(at: [indexPath!], with: UITableViewRowAnimation.none) 
    } 

답변

1

당신은 로컬 변수로 rowChecked를 선언하고 클래스 속성 인 것처럼 self.rowChecked으로 호출된다.

이 문제를 해결하려면 rowChecked 앞에 self.을 제거하십시오.

올드 :

cb.check(self.rowChecked[indexPath.row]) 

새로운 기능 :

cb.check(rowChecked[indexPath.row]) 

더 문제가있을 수 있습니다,하지만 당신의 코드와 오류 현재의 약자에 대한 이유입니다.

1

tableView:cellForRowAt 메서드 내에 var rowChecked: [Bool] = Array(repeating: false, count: tasks.count) 행이 있으므로 로컬 변수이므로 클래스의 속성이 아닙니다.

즉, cb.check(self.rowChecked[indexPath.row]) ~ cb.check(rowChecked[indexPath.row]) (삭제 된 self.)이 줄을 변경해야한다는 의미입니다.

관련 문제