2017-10-25 12 views
0

나는이 문제를 100 번 조사했지만 여전히 내 문제의 답을 찾을 수 없습니다. 나는 매우 간단한 프로토콜을 가지고 있지만 항상 nil입니다. periodDelegate = self을 추가하려고했지만 오류가 발생했습니다. Cannot assign value of type 'ScoreClockPopoverViewController' to type 'PeriodDelegate!' 다른 프로토콜을 사용하고 있습니다. 동일한 설정을 사용하고 정상적으로 작동합니다.스위프트 대리인 프로토콜이 없음

무엇이 누락 되었습니까?

미리 감사드립니다. 내가 호출 할 필요가

import UIKit 

protocol PeriodDelegate { 

    func changePeriodButtonImage(selectedPeriod: Period) 

} 

class ScoreClockPopoverViewController: UIViewController { 

    //delegate 
    var periodDelegate: PeriodDelegate! 

    override func viewDidLoad() { 
     super.viewDidLoad() 


     print("viewDidLoad/periodDelegate \(String(describing: periodDelegate!))") 

    } 

} 

기능 모두의 UICollectionViewCell`

class HeaderCollectionViewCell: UICollectionViewCell { 

    override func awakeFromNib() { 
     super.awakeFromNib() 

     ... 

    } 


extension HeaderCollectionViewCell: PeriodDelegate { 

    func changePeriodButtonImage(selectedPeriod: Period) { 

     print("blah") 

     switch selectedPeriod { 
     case .first: 
      print("first") 
     case .second: 
      print("second") 
     case .third: 
      print("third") 
     case .overtime: 
      print("overtime") 
     case .shootout: 
      print("shootout") 

     } 
    } 
} 
+0

위임자가 viewcontroller가 아닌 셀에 일치하도록하십시오. –

+1

대리인을 클래스 전용으로 설정하고 약하게 만듭니다. – the4kman

+0

UICollectionView 용 컨트롤러가 있습니까? – Michel

답변

0

첫째로, 뷰 컨트롤러를위한 대리인으로 휴대가 매우 드물다. 평소와는 다른 방향입니다. 그러나 어쨌든, 귀하의 경우에는 periodDelegate을 셀이 아닌 셀로 설정해야합니다. VC가 아닌 델리게이트 프로토콜을 셀에 구현합니다. 그러나 나쁜 디자인처럼 냄새를 맡기 때문에 무엇을하고 싶은지 다시 생각해보십시오.

0

귀하의 진술은 "나는 매우 간단한 프로토콜을 가지고 있지만 항상 그렇지 않습니다." 말도 안 돼.

프로토콜은 특수 언어입니다. nil 또는 nil이 될 수 없습니다.

ScoreClockPopoverViewController에는 PeriodDelegate 프로토콜을 준수하는 대리인 속성 인 periodDelegate이 있으며 위임 속성은 nil입니다.

대표단은 다른 어떤 기관과 마찬가지로 속성입니다. 값을 지정하지 않으면 아무 것도 표시되지 않습니다. 객체를 결코 ScoreClockPopoverViewController의 대리자로 지정하지 않았기 때문에 아무 것도 아닙니다.

누가 ScoreClockPopoverViewController의 인스턴스를 만들고 누가 ScoreClockPopoverViewController의 대리인이 될 개체가 있습니까?

ScoreClockPopoverViewController을 생성하는 코드를 게시하십시오. 델리게이트를 지정할 필요가있는 곳입니다. 그 코드는 다음과 같이 볼 수 있습니다.

let myScoreClockPopoverViewController = storyboard.instantiateViewControllerWithIdentifier("ScoreClockPopoverViewController") 
myScoreClockPopoverViewController.periodDelegate = self 
present(myScoreClockPopoverViewController, 
    animated: true, 
    completion: nil) 

(즉, 코드가 가이드로 의미하고 당신이 앱에서 작동하도록 수정해야합니다을 당신은 귀하의 응용 프로그램에 붙여 넣을 수 없습니다)

이름에서 알 수 있듯이 myScoreClockPopoverViewController를 팝업으로 표시하려면 위의 코드를 조정해야합니다.