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

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

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

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

Q&A

解決済

1回答

3620閲覧

XcodeのPageViewController.swift編集中のエラーについて

退会済みユーザー

退会済みユーザー

総合スコア0

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Xcode

Xcodeはソフトウェア開発のための、Appleの統合開発環境です。Mac OSXに付随するかたちで配布されています。

Swift

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

0グッド

0クリップ

投稿2016/12/14 14:12

編集2016/12/14 14:33

【決定版】UIPageViewControllerの使い方(Swift)
↑上のサイトを見ながら作業を進めていたのですが、
いくつかエラーが出たので原因と解決方法を教えていただきたいです。
サイト中の「UIPageViewControllerを編集しよう」の「2.最初の画面を設定」までは動作確認できています。

#環境
Xcode:バージョン8.2(8C38)
macOS Sierra:バージョン10.12.2

#コードとエラー内容
PageViewController.swift内のコードと3つのViewControllerの名前はすべて上記のサイトと同じです。
(サイトのコード中のreturn storyboard!.instantiateViewControllerWithIdentifier ...の部分は書き直せというエラーが出たのでここではreturn storyboard!.instantiateViewController(withIdentifier:) ...と修正しています。)
エラー箇所は全部で5箇所で、エラーが出た部分に// ↓ エラーとコメントしています。

// PageViewController.swift import UIKit class PageViewController: UIPageViewController { override func viewDidLoad() { super.viewDidLoad() self.setViewControllers([getFirst()], direction: .forward, animated: true, completion: nil) self.dataSource = self } func getFirst() -> FirstViewController { return storyboard!.instantiateViewController(withIdentifier:)("FirstViewController") as! FirstViewController } func getSecond() -> SecondViewController { return storyboard!.instantiateViewController(withIdentifier:)("SecondViewController") as! SecondViewController } func getThird() -> ThirdViewController { return storyboard!.instantiateViewController(withIdentifier:)("ThirdViewController") as! ThirdViewController } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() } } // ↓ エラー① extension PageViewController : UIPageViewControllerDataSource { func pageViewController(pageViewController: UIPageViewController, viewControllerBeforeViewController viewController: UIViewController) -> UIViewController? { // ↓ エラー② if viewController.isKindOfClass(ThirdViewController) { // 3 -> 2 return getSecond() // ↓ エラー③ } else if viewController.isKindOfClass(SecondViewController) { // 2 -> 1 return getFirst() } else { // 1 -> end of the road return nil } } func pageViewController(pageViewController: UIPageViewController, viewControllerAfterViewController viewController: UIViewController) -> UIViewController? { // ↓ エラー④ if viewController.isKindOfClass(FirstViewController) { // 1 -> 2 return getSecond() // ↓ エラー⑤ } else if viewController.isKindOfClass(SecondViewController) { // 2 -> 3 return getThird() } else { // 3 -> end of the road return nil } } }

エラー内容は
①がType 'PageViewController' does not conform to protocol 'UIPageViewControllerDataSource'
②〜⑤がValue of type 'UIViewController' has no member 'isKindOfClass'
です。

#質問:エラーの解決方法は?
google翻訳で翻訳してみると、
エラー①は
「タイプ 'PageViewController'はプロトコル 'UIPageViewControllerDataSource'に準拠していません」
エラー②〜⑤は
「タイプ 'UIViewController'の値にメンバー 'isKindOfClass'がありません」
と言っていることがわかりました。

②〜⑤のValue of type 'UIViewController' has no member 'isKindOfClass'は、
Swiftのコンパイルエラー寄せ集め←ここのサイトを参考にすると
「UIViewControllerの中にisKindOfClassが無い(?)」という意味かと考えたのですが、ではどうすれば解決するのかがわかりません。
①に関しても同じです。

解決策と原因が分かる方がいらっしゃれば、回答よろしくお願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

エラー①は、protocolのシグニチャと合致してないから。
エラー②〜⑤は、isKindOfClassはisKindに変更されました。引数のクラスは{クラス名}.selfで渡します。

swift

1import UIKit 2 3class PageViewController: UIPageViewController { 4 5 override func viewDidLoad() { 6 super.viewDidLoad() 7 self.setViewControllers([getFirst()], direction: .forward, animated: true, completion: nil) 8 self.dataSource = self 9 } 10 11 func getFirst() -> FirstViewController { 12 return storyboard!.instantiateViewController(withIdentifier: "FirstViewController") as! FirstViewController 13 } 14 15 func getSecond() -> SecondViewController { 16 return storyboard!.instantiateViewController(withIdentifier: "SecondViewController") as! SecondViewController 17 } 18 19 func getThird() -> ThirdViewController { 20 return storyboard!.instantiateViewController(withIdentifier: "ThirdViewController") as! ThirdViewController 21 } 22 23 override func didReceiveMemoryWarning() { 24 super.didReceiveMemoryWarning() 25 } 26} 27 28extension PageViewController : UIPageViewControllerDataSource { 29 30 func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? { 31 32 if viewController.isKind(of: ThirdViewController.self) { 33 // 3 -> 2 34 return getSecond() 35 } else if viewController.isKind(of: SecondViewController.self) { 36 // 2 -> 1 37 return getFirst() 38 } else { 39 // 1 -> end of the road 40 return nil 41 } 42 } 43 44 func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? { 45 46 if viewController.isKind(of: FirstViewController.self) { 47 // 1 -> 2 48 return getSecond() 49 } else if viewController.isKind(of: SecondViewController.self) { 50 // 2 -> 3 51 return getThird() 52 } else { 53 // 3 -> end of the road 54 return nil 55 } 56 } 57}

エラー①の補足

「タイプ 'PageViewController'はプロトコル 'UIPageViewControllerDataSource'に準拠していません」 というのは実装を義務付けらているメソッドが存在しないという意味です。commandを押しながらUIPageViewControllerDataSourceをクリックして定義を確認してみると上の2つは実装がマストなのがわかります(オプショナルでない)。今回のシグニチャというのは、ファンクション名および引数の型と戻り値の型や外部引数名の定義です。修正前はこの定義がUIPageViewControllerDataSourceプロトコルで宣言されているものと違うので実装されていないとみなされエラーになっていました。

swift

1public protocol UIPageViewControllerDataSource : NSObjectProtocol { 2 3 @available(iOS 5.0, *) 4 public func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? 5 6 @available(iOS 5.0, *) 7 public func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? 8 9 @available(iOS 6.0, *) 10 optional public func presentationCount(for pageViewController: UIPageViewController) -> Int // The number of items reflected in the page indicator. 11 12 @available(iOS 6.0, *) 13 optional public func presentationIndex(for pageViewController: UIPageViewController) -> Int // The selected item reflected in the page indicator. 14} 15

投稿2016/12/14 15:46

編集2016/12/15 20:45
fromageblanc

総合スコア2724

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

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

退会済みユーザー

退会済みユーザー

2016/12/15 17:34

回答有難うございます。無事動作確認ができました。 もし良ければもう一つ教えていただきたいのですが、 回答中の「プロトコルの"シグニチャ"と合致していない」の Swiftでのシグニチャとは何か・「プロトコルとシグニチャが合致していない」とはどういう状態のことかを 簡単にでもいいので教えていただきたいです。
退会済みユーザー

退会済みユーザー

2016/12/16 17:06

補足追加有難うございます。助かりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問