2017-12-16 3 views
0

ラベルビューを持つカスタムテーブルビューセルがあります。そのビューがクリックされたときに関数を呼び出すためにtapGestureを追加しました。 現在のところ、私のカスタムビューセルは、それ自身の迅速なファイルです。私は次のコードを追加して、そのラベルをクリックしたときに「共有拡張」を有効にしました。swift UIViewControllerカスタムセル内のボタン

CustomCellView.swift 

    10 myLabel.isUserInteractionEnabled = true 
    11 let tap = UITapGestureRecognizer(target: self, action: #selector(tapLabelGesture)) 
    12 myLabel.addGestureRecognizer(tap) 

    13 func tapLabelGesture() { 
    14 print("Clicked on Label ") 
     let url="www.google.com" 
    15 let activityVC = UIActivityViewController(activityItems: [url], applicationActivities: nil) 

    16 activityVC.popoverPresentationController?.sourceView = self.view 
    17 self.present(activityVC, animated: true, completion: nil) 
    18 } 

self.viewの場合は16行目、self.present()の場合は17行目にコンパイラエラーが発生します。質問はどのようにポップアップの表示を提供するのですか?

このコード私は別のビュー(テーブルビューもセルもありません)をテストとして使用しましたが、正常に動作しました。だから私はtableview/cellのために同じテクニックをしようとしています。この問題を解決するにはどうすればよいですか?どんな助けもありがとうございます。ライン16については

+0

コンパイラは何を言いますか? –

答えて

1

あなたはUIViewControllerは、その性質を持っており、あなたのCustomCellViewは、そのためのcontentViewを持っているので、あなたのクラスがUITableViewCellないUIViewControllerのサブクラスであるので、あなたのクラスCustomCellViewは何のメンバーviewを持っていないというエラーを取得しています。 17行の場合

:あなたはそのためのself.presentを使用できない理由

クラス上記と同じことがUIViewControllerのthatsのサブクラスではありません。

ソリューション:

代わりのUITapGestureRecognizerを使用して、あなたがUILabelにし、あなたのUIViewControllerクラスに配置できるUIButtonを使用することができ、あなたのcellForRowAt方法でbutton.tagbutton.addTargetを追加します。

ボタンメソッドにコードを追加して、UIActivityViewControllerを提示することができます。

希望すると、これが役立ちます。

+0

私はボタンではしませんでしたが、各セルにラベル自体のためにcellForRowAt()メソッドにタップジェスチャーを追加するアイディアを与えました。この問題を解決しました。だから、提案に感謝します。ラベルの値(各セルのラベルの値は動的)を読み取るには、接続された問題があります。これは間違いなく論理的な質問ですが、私が新しい質問としてそれを開くべきかどうかは分かりません。 – Atarang

+0

私は最初にgoogleをお勧めします。@Atarang –

0

@DharmeshKeniで述べたように、UITableViewCellというサブクラスをUIViewControllerのように使用することはできません。 viewプロパティとpresentメソッドを提供しません。あなたの質問に答える

、あなたはCustomCellViewでクロージャを格納することができ:

var onLabelTappedCallback: (() -> Void)? 

はあなたのセレクタにそれを呼び出す:

@objc private func tapLabelGesture() { 
    onLabelTappedCallback?() 
} 

、最終的にcellForRowAt方法で実装します。

cell.onLabelTappedCallback = { 
    print("Label tapped") 
    //Present additional vc 
} 

このソリューションはで動作します210も同様である。

+0

onLabelTappedCallback()をtapLabelGesture()から呼び出すにはどうすればいいですか?定義はcellForRowAt()です。これは "未解決の識別子"エラーのコンパイルエラーです。 – Atarang

+0

私はあなたにとても従っていません。 'cellForRowAt'メソッドでは、public' CustomCellView'のプロパティ 'onLabelTappedCallback'にのみクロージャを割り当てます。 'CustomCellView'クラスでは' onLabelTappedCallback?() 'と呼んでいます。 私はそれを確認するプロジェクトを作成しました[ここ](https://github.com/TomaszPietrowski/TableViewCellWithTappableLabelExample)。私はこれがあなたの疑問を明確にするのに役立つことを願っています。 – Fayer

+0

これはうまくいくように見えます。やってみます。ありがとう。 – Atarang

関連する問題