2017-03-24 4 views
0

사용자 지정 셀이있는 UITableView 팝업을 표시하려고하지만 셀의 UILabel 아울렛은 항상 nil입니다. 스토리 보드를 사용하여 popover tableview 및 사용자 정의 셀을 작성했습니다. 모든 것이 제대로 연결되어 있고 내 맞춤 셀에 '셀'식별자가 있습니다. Popover가 올바르게 표시됩니다. 사용자 정의 셀의 레이블이 0이 아니기 때문에 레이블이 설정되지 않습니다.사용자 지정 셀이있는 UITableView popover가 셀 특성을 사용하여 항상 실패합니다.

저는 Apple 메서드 (아래 buttonFressed 함수 참조)와 UITableViewCell's attributes are nil when instantiating UITableView as a popover에 제안 된 segue 메서드를 사용하여 팝업 표시를 시도했지만 어느 것도 내 문제를 해결하지 못했습니다.

내 사용자 지정 UITableViewCell 클래스에는 연결된 레이블이 두 개 있고 연결되지 않은 int가 하나 있습니다.

다음
class PopoverTableCell : UITableViewCell { 
    @IBOutlet var label1: UILabel! // <== connected in storyboard 
    @IBOutlet var label2: UILabel! // <== connected in storyboard 

    var int3 : Int? = nil 
} 

내가 (버튼 누름을 통해) 뷰 컨트롤러에서 (애플의 방법)을 제시하는 방법은 다음과 같습니다 : 모든 스토리 보드 연결이 유효한 것 성공적으로 팝 오버를 제공

class ViewController: UIViewController { 

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

    @IBAction func buttonPressed(_ sender: UIButton) { 
     let popoverController = PopoverController() 
     popoverController.modalPresentationStyle = UIModalPresentationStyle.popover 
     popoverController.preferredContentSize = CGSize(width: 200, height: 300) 

     present(popoverController, animated: true, completion: nil) 

     let popoverPresentationController = popoverController.popoverPresentationController 
     popoverPresentationController?.sourceView = sender 
     popoverPresentationController?.sourceRect = CGRect(x: 0, y: 0, width: sender.frame.size.width, height: sender.frame.size.height) 

    } 

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

} 

하지만 난하려고 할 때 셀에 레이블을 설정하면 레이블이 항상 nil이므로 실패합니다.

class PopoverController : UITableViewController { 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     // it makes no difference if I set these or not - storyboard does it for me 
     self.tableView.delegate = self 
     self.tableView.dataSource = self 

     // if I don't register, the cell fails to deque 
     self.tableView.register(PopoverTableCell.self, forCellReuseIdentifier: "Cell") 
    } 

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
     let cell = tableView.dequeueReusableCell(withIdentifier: "Cell") as! PopoverTableCell 
     cell.backgroundColor = UIColor.yellow 
     cell.label1?.text = "Label 1111" 
     cell.label2?.text = "Label 2222" 
     cell.int3 = 5555 
     print("label1: \(cell.label1)")  // <== always nil 
     print("label2: \(cell.label2)")  // <== always nil 
     print("label3: \(cell.int3)")  // <== always Optional(5555) which is correct 
     return cell 
    } 

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

} 

나는 cellForRowAt 기금의 반환 문에 중단 점을 넣어, 내가 디버거에서이 얻을 :

Debugger Image 상관없이 내가 뭘

의 LABEL1 및 라벨 2 출구는 항상 전무 하지만 int3 (콘센트가 아님)는 잘 작동하는 것 같습니다.

+0

스토리 보드의 장면에 이러한 프로토 타입 셀이 있습니까? 스토리 보드에서 셀의 식별자를 설정하고 코드에서 셀을 등록해야합니다. 스토리 보드에서 만든 코드에는 셀을 등록 할 수 없습니다. – dan

답변

0

나는이 댓글에서 설명하는 문제를 생각 :

// if I don't register, the cell fails to deque 

을하고 무기 호 매장은 동일한 문제의 증상입니다.

스토리 보드에 콘센트를 만드는 경우 PopoverController()을 사용하여보기 컨트롤러를 만들 때 사용하는 기본값 인 init() 방법으로 제대로 초기화되지 않습니다. 이런 식으로 인스턴스를 다음

view controller with storyboard id

을 그리고 :

스토리 보드에서 뷰 컨트롤러에게 ID를 제공하십시오

let popoverController = storyboard?.instantiateViewController(withIdentifier: "MyViewController") as! PopoverController 

를이 경우, 세포는 (스토리 보드에서 끌어한다 정확히 말하면, init() 대신 init?(coder aDecoder: NSCoder) 메서드를 실행하므로 해당 아울렛이 0이되지 않습니다. 이 방법으로 뷰 컨트롤러를 인스턴스화하면 셀을 등록 할 필요가 없습니다.

0

스토리 보드에 셀을 생성했기 때문에 셀을 등록 할 필요가 없습니다. 나는 또한 오류를 설명하고 싶습니다 : 오류 Int에서 잘 작동하지만 UILabel은 무효입니다. 이유는 UILabel (모든보기)이로드되지 않기 때문입니다.

+0

고마워.하지만 UILabels이로드되지 않는 이유는 무엇입니까? – Drew

관련 문제