2016-09-02 9 views
0

私が直面している問題で頭を抱えようとしています。私はボタンを押して共有シートを介してURLを共有したい。ここでは、私がこれまで持っているものです:Value of type 'SideMenu' has no member 'presentViewController':私は次のエラーを与えたUIViewから共有シートを呼び出す

import UIKit 
class SideMenu: UIView { 
    //share app 
    @IBAction func shareAppBtn(sender: AnyObject) { 
     print("shareAppBtn tapped") 
     let myWebsite = NSURL(string:"http://www.google.com/") 
     guard let url = myWebsite else { 
      print("nothing found") 
      return 
     }  
     let shareItems:Array = [url] 
     let activityViewController:UIActivityViewController = UIActivityViewController(activityItems: shareItems, applicationActivities: nil) 
     self.presentViewController(activityViewController, animated: true, completion: nil) 
    } 
} 

。私はpresentViewController UIViewcontrollerのコンポーネントであり、私はUIViewから呼び出すので、上記が動作しないと思う。

はので、代わりに私がのUIViewControllerを呼び出そうとし、次のことを試してみました:

import UIKit 
class SideMenu: UIView { 
//share app 
@IBAction func shareAppBtn(sender: AnyObject, viewController : UIViewController) -> Void 
{ 
    print("shareAppBtn tapped") 
    let myWebsite = NSURL(string:"http://www.google.com/") 
    guard let url = myWebsite else { 
     print("nothing found") 
     return 
    } 
    let shareItems:Array = [url] 
    let activityViewController:UIActivityViewController = UIActivityViewController(activityItems: shareItems, applicationActivities: nil) 
    viewController.presentViewController(activityViewController, animated: true, completion: nil) 
    } 
} 

をしかし、上記の私に与えた次のエラー:unrecognized selector sent to instance 0x7fe93acb6720'を。

だから私は最終的にしてみました:

import UIKit 
class SideMenu: UIView { 
//share app 
@IBAction func shareAppBtn(sender: AnyObject) { 
    print("shareAppBtn tapped") 
    let myWebsite = NSURL(string:"http://www.google.com/") 
    guard let url = myWebsite else { 
     print("nothing found") 
     return 
    } 
    let shareItems:Array = [url] 
    let activityViewController:UIActivityViewController = UIActivityViewController(activityItems: shareItems, applicationActivities: nil) 
    self.window?.rootViewController?.presentViewController(activityViewController, animated: true, completion: nil) 
    } 
} 

しかし、上記の私に次のエラーが発生しました:

Warning: Attempt to present <UIActivityViewController: 0x7fe03e04c600> on <RAMAnimatedTabBarController.RAMAnimatedTabBarController: 0x7fe03bc4a170> which is already presenting <SideMenu.UISideMenuNavigationController: 0x7fe03c094200> 

は、私がここで何をしないのですか?私はUIView上でシェアシートを呼びたい。

ありがとうございました。

+0

'@ IBAction'メソッドの関数シグネチャを変更することはできません。あなたの問題は、このコードはおそらく 'UIView'に属していないということです。委譲パターンを使用して、タップ・イベントを包含ビュー・コントローラーに渡すか、または含まれているビュー・コントローラーにUIViewのプロパティーへの参照を設定させて、 – Paulw11

+0

上の 'presentViewController'を呼び出すオブジェクトを知ることができます'UIActivityViewcontroller'を表示する前に遅延を与えてみてください。エラーはこれを意味するようです。 – Gokul

答えて

0

これは期待どおり動作しています。UIViewはビューを表示するはずです。彼らはそれを扱う代表者に報告しなければならない。

SideMenuの場合は、あなたのUIView、あなたは何をしているのかを処理するための代理人が必要です。デリゲートとしてSideMenuを提示ビューコントローラを...設定だから私は手早くサンプルコードのビット..

protocol SideMenuDelegate { 

    func sideMenuDidShare() 

} 

デリゲートプロトコルは、あなたのSideMenuビューを扱うビューコントローラが実装して何を使用して

class SideMenu: UIView { 
    var delegate: SideMenuDelegate? 
} 

サイドビューの表示クラスでは、デリゲートプロパティを追加します。

class SideMenuViewController: UIViewController, SideMenuDelegate { 

    func sideMenuDidShare() { 
     print("this is where your share code goes and where you can present other viewControllers from") 
    } 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     let sideMenu = self.view as? SideMenu 
     sideMenu?.delegate = self 

    } 

} 

SideMenuを処理するView Controllerでは、SideMenuDelegateプロトコルを実装します。 class SideMenuViewController: UIViewController, SideMenuDelegate

このようにすると、何かが起きたときにSideMenuがその代理人(ViewController)に伝えることができます。この場合、実装されているfunc sideMenuDidShare()です。

+0

Adrianが詳細な情報をありがとう、私はdelagtesの仕組みを理解していると思う。しかし、あなたが提供したコードは動作していないようです。 'shareAppBtn'ボタンをクリックすると' SideMenuViewController'からの印刷が表示されません。あなたのコードからすべてのsideMenuDidShareが 'shareAppBtn'に名前が変更されたことを確実にしました。 – user3591436

+0

私はあなたのための簡単な例を書いて、私のdropboxにアップロードしました:https://dl.dropboxusercontent.com/u/61211034/Stackoverflow/DelegateFun.zip助けてくれることを願っています! –

+0

ちなみに、シムやデバイスでアプリを実行するときに行う必要があるのは、オレンジ色の四角形をタップすることだけです。それはあなたの利便性のためにSideMenuと呼ばれる「UIView」です: –

関連する問題