2017-12-14 25 views
0

を使用することができます。は、私は次のように定義された小さなプロトコル持つプロトコルで@IBOutlets(スウィフト)

import UIKit 

protocol HasMeterAnimation { 
    func animateMeter(scrollableView: UIScrollView) 
} 

をそれは実装のIBOutletsを使用する必要があります:

func animateMeter(scrollableView: UIScrollView) { 

    let maxYPosTableview = scrollableView.frame.height + scrollableView.frame.origin.y 
    let progressBarRect = self.progressBar.frame 
    let rectOfProgressBarInParentView = self.convert(progressBarRect, to: scrollableView.superview) 
    let maxYPosMeter = rectOfProgressBarInParentView.origin.y + progressBarRect.height 

    if maxYPosTableview > maxYPosMeter { 
     if progressBar.isHidden == false { 
      progressBar.animateProgressBar() 
      model.shouldMeterAnimate = false 
     } 
    } 
} 

私が望む何私がこの実装をIBOutletsを使ってプロトコル拡張に書き込む方法があるかどうかを知るためには、次のようなものがあります。

protocol HasMeterAnimation { 

     @IBOutlet var progressBar:AnimatedProgressBar! { get set } 
     var model: ListItem! { get set } 

     func animateMeter(scrollableView: UIScrollView) 
    } 

extension HasMeterAnimation { 

      func animateMeter(scrollableView: UIScrollView) { 

       let maxYPosTableview = scrollableView.frame.height + scrollableView.frame.origin.y 
       let progressBarRect = self.progressBar.frame 
       let rectOfProgressBarInParentView = self.convert(progressBarRect, to: scrollableView.superview) 
       let maxYPosMeter = rectOfProgressBarInParentView.origin.y + progressBarRect.height 

       if maxYPosTableview > maxYPosMeter { 
        if progressBar.isHidden == false { 
         progressBar.animateProgressBar() 
         model.shouldMeterAnimate = false 
        } 
       } 
      } 

私は多くの方法を試しましたが、私にエラーを与え続けます。ありがとう

+0

'@ IBOutlet'を削除するとエラーが発生しますか?ここでは役に立たない。あなたはどんなエラーを受けていますか? –

+1

私はそれを解決しました。受け入れられた答えは正しいです... IBOutletsはプロトコルで意味をなさない。私はプロトコルでプロパティを定義し、コントローラでIbOutletとして実行しました。 –

答えて

2

IBOutletは、インタフェースビルダーに、たとえばViewController、Viewなどのクラスのインタフェースビルダーからオブジェクトを参照することを知らせるための単なるキーワードです。他のコンテキストではIBOutletは意味をなさない。あなたのプロトコルでプロパティを定義するときには、それらを強制アンラップとしてマークしません。プロパティを明示的にオプションとしてマークしないと、プロパティは実行時に値を持たなければなりません。そうしないと、コードをコンパイルできません。インタフェースビルダーは、アウトレットをコンパイル時に値を持たず実行時に解決されるため、アンラップされていないものとしてマークします。

+0

すべて完全に正しいのですが、私はその質問への答えは本当に最初の2つの文章だと思います。どのIBOutletもビューまたはビューコントローラ(クラスとなる)に属しています。他のものに属するIBOutletは意味をなさない。 – Connor

+0

@ ok404私のプロトコルでプロパティを定義した場合、コントローラのiboutletとして使用できますか?プロトコルが満足していると教えてくれますか? –

+1

ObjCでは、 'IBOutlet'は文字通り何も置き換えられていない#defineマクロです(文字通り空です)。 Swiftはそれを行うことができませんでした(プリプロセッサはありません)ので、属性が必要でしたが、コンセプトは同じです。 Xcodeに、マウスを使用してUI要素を接続したいことがあることを知らせるのは、唯一の目的です。システムにはコンパイル時や実行時の影響は全くありません(Swiftでは100%真実ではないかもしれません;私は '@ objc'を自動的に挿入するかもしれません)。しかし、プロトコル適合性には絶対に影響しません。 –

関連する問題