質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Swift 2

Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

Q&A

解決済

1回答

5406閲覧

Swiftでアクションシート表示後のシートをタップしても動作しない

eizi

総合スコア13

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Swift 2

Swift 2は、Apple社が独自に開発を行っている言語「Swift」のアップグレード版です。iOSやOS X、さらにLinuxにも対応可能です。また、throws-catchベースのエラーハンドリングが追加されています。

0グッド

0クリップ

投稿2016/04/13 05:59

ViewController.swiftに記載のボタンアクションで、別ファイル(ShareManager.swift)に記載したクラスからアクションシートを表示させ、シートをタップするとFacebook、Twitterをシェアするためのダイアログを表示させようとしているのですが、それが表示されません。

アクションシートを表示さるところまではうまく行ってます。

Swift

1// ViewController.swift 2 3import UIKit 4import Social 5 6class ViewController: UIViewController { 7 @IBAction func btnShowAction(sender: AnyObject) { 8 let showAction = shareManager().showActionSheet() 9 presentViewController(showAction as! UIViewController, animated: true, completion: nil) 10 } 11 12 func showSNS(i: Int) { 13 let dialog = shareManager().setSNS(i) 14 // print(dialog)は返ってきてる 15 presentViewController(dialog as! UIViewController, animated: true, completion: nil) 16 } 17 override func viewDidLoad() { 18 super.viewDidLoad() 19 } 20}

Swift

1// ShareManager.swift 2 3import UIKit 4import Social 5 6class shareManager { 7 func showActionSheet() -> AnyObject { 8 let actionSheet = UIAlertController() 9 actionSheet.addAction( 10 UIAlertAction(title: "Facebook", style: .Default, handler: {(action) -> Void in 11 ViewController().showSNS(0) 12 }) 13 ) 14 actionSheet.addAction( 15 UIAlertAction(title: "Twitter", style: .Default, handler: {(action) -> Void in 16 ViewController().showSNS(1) 17 }) 18 ) 19 actionSheet.addAction( 20 UIAlertAction(title: "キャンセル", style: .Cancel, handler: nil) 21 ) 22 return actionSheet 23 } 24 25 func setSNS(i: Int) -> AnyObject { 26 var dialog = SLComposeViewController() 27 switch i { 28 case 0: 29 dialog = SLComposeViewController(forServiceType: SLServiceTypeFacebook) 30 case 1: 31 dialog = SLComposeViewController(forServiceType: SLServiceTypeTwitter) 32 default: 33 break 34 } 35 dialog.setInitialText("共有するテキスト") 36 return dialog 37 } 38}

下記のWarningが出てたのでネットで検索して

Warning: Attempt to present <SLComposeViewController: 0x1769f2f0> on <test.ViewController: 0x176dc240> whose view is not in the window hierarchy!

表示させるタイミングなのかと思って遅延処理を入れてみたのですが、それでもダメでした。

Swift

1// ViewController.swift 2 let delayTime = dispatch_time(DISPATCH_TIME_NOW, Int64(1 * Double(NSEC_PER_SEC))) 3 dispatch_after(delayTime, dispatch_get_main_queue()) { 4 self.presentViewController(dialog as! UIViewController, animated: true, completion: nil) 5 }

環境
Xcode 7.3
Swift 2.2

まだまだ理解できていないこともありますが、よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

問題は
ViewController().showSNS(0)
です。
これはViewController()で新しいインスタンスのViewControllerを生成し、
その新しいViewControllerのshowSNS()を呼び出しています。
現在表示中でない新しいViewControllerを使って画面遷移しようとしているので、
「whose view is not in the window hierarchy!」
というエラーになっています。
現在表示中のViewControllerは、これとは別のViewControllerです。
その現在表示中のViewControllerを使って画面遷移する必要があります。

とりあえずshowActionSheet()showActionSheet(vc:ViewController)のように変更してViewControllerをパラメータで受け取れるようにした上で、ViewController().showSNS(0)vc.showSNS(0)とし、
let showAction = shareManager().showActionSheet(self)という形で呼び出せば、たぶんうまく表示できると思います。

投稿2016/04/13 17:48

TakeOne

総合スコア6299

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

eizi

2016/04/13 23:33

なるほど、別のViewControllerを生成していたというわけですね。 やはり理解できていなかったのですが、お陰様で頭の中がスッキリしました。 教えて頂いた内容で無事に表示させることができました ありがとうございました!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問