2

Swift CocoaPod libをラップするNativeScriptプラグインを作成しています。セルフデリゲートを使用してTypeScriptでNativeScriptクラスを実装するにはどうすればよいですか?

私のNativeScript pluginでは、別のクラスを使用して、メインクラスに必要なdelegateを追加しています。

メインクラスにデリゲートメソッドを実装し、デリゲートクラスを完全に回避できますか?

すなわち、より良い

export class MicrosoftBandService extends NSObject implements ConnectionDelegate { 

    static new(): MicrosoftBandService { 
    return <MicrosoftBandService>super.new() 
    } 

    constructor() { 
    let _self= this; 
    this.mbk = MicrosoftBand.alloc().init(); 
    this.mbk.connectDelegate = _self 
    } 

    onConnecte() { 
    // 

    onDisconnecte() { 
    // 
    } 

    onErrorWithError(error) { 
    // 
    } 

} 

、私はこの

export class MicrosoftBandService extends MicrosoftBand implements ConnectionDelegate { 

    static new(): MicrosoftBandService { 
    return <MicrosoftBandService>super.new() 
    } 

    constructor() { 
    let _self= this; 
    this.connectDelegate = _self 
    } 

    onConnecte() { 
    // 
    } 

    onDisconnecte() { 
     // 
    } 

    onErrorWithError(error) { 
     // 
    } 

    } 

のようにやりたい私はNativeScript

のために活字体で自己デリゲートを持つコンストラクタを実装するために適切な構文を知りません私の現在のコードは動作しますが、別のデリゲートクラスを削除することでコードを簡素化し、減らすための助けが必要です。

+1

コメントを1つ追加したいだけです。あなたがスイフトを使用することを避けることができれば;あなたはそうするのが良いです。 Swiftは、20メガ以上の追加ランタイムをアプリに少し追加します。 – Nathanael

答えて

3

TypeScriptがJavascriptに変換されると、インターフェイスは失われます。

export class MicrosoftBandService extends NSObject implements ConnectionDelegate {  
    public static ObjCProtocols = [ ConnectionDelegate ]; 
    ... 
} 

第二の活字体のコンストラクタはネイティブオブジェクトに(おそらくそのことについて、コンソールに警告している)と呼ばれていません。だから、ObjCProtocols静的フィールドを使用してのように、このクラスによって実装されているプロトコルを宣言する必要があります。 だから、あなたがinit方法とそこにすべてのフィールドを設定して実行する必要があります。

public static initWithOwner(band: MicrosoftBand): MicrosoftBandService { 
    let delegate = <MicrosoftBandService>MicrosoftBandService.new(); 
    delegate._band = band; 
    band._delegate = delegate; 
    band.connectDelegate = delegate. 
} 

をここで注意すべき点がいくつかあります。

  1. は、新しい()オーバーロードを避けてください。一部のネイティブオブジェクトに問題が発生する可能性があります。最も代表者が弱参照として実装されている - (あなたがそれを必要とする場合)は、デリゲートメソッドでそれを呼び出すことができるように

  2. がローカルバンドにデリゲートの参照を保持バンドインスタンスを渡します。参照を保持しないと誰もそれを行いませんし、それはある時点でGCによって収集されます。プロトコルの実装について

詳しい情報はここで見つけることができます: http://docs.nativescript.org/runtimes/ios/how-to/ObjC-Subclassing

編集:

export class MicrosoftBandService extends MicrosoftBand implements ConnectionDelegate 

を限り、あなたは静的ObjCProtocolsフィールドを追加すると: はそれを行うことが可能であるべきです。その後、同じインスタンスになるため、デリゲートへの参照を保持する必要はありません。 Still TypeScriptのコンストラクタは呼び出されないので、正しいinitネイティブメソッドを呼び出す必要があります。

関連する問題