質問編集履歴

5 ログの追記

退会済みユーザー

退会済みユーザー

2017/02/15 17:43  投稿

UICollectionView xibに配置したボタンをタップして画像をモーダル表示させたい
###前提・実現したいこと
xcode8 swift3 iPad
UICollectionViewを使用して、画像のスライドショーみたいなものを作っています。
各セルのサイズはフルスクリーンです。
各セルのレイアウトは違っていて、indexPathごとにカスタムセルでxibを使っています。
セルにボタンを配置してボタンをタップしたら、画像をモーダル表示したいです。
storyboardにViewControllerをUICollecitonViewを配置したものとは別に、新たに配置しています。
xibのボタンから新たに配置したViewControllerに遷移させたいです。
###発生している問題・エラーメッセージ
xibにボタンを配置しましたが、そこからのモーダル表示が上手くいきません。
UICollectionViewCellクラスからの遷移方法がわからず、色々と試していますが、上手くいっておりません。
selfのところでエラーとなっていますが、UICollectionViewクラスではないからと思いましたが、解決方法がわかっておりません。
###該当のソースコード
```swift
// カスタムセルクラス
class CollectionViewCell2: CommonCollectionViewCell {
   
   @IBOutlet weak var mainImage: UIImageView!
   
   override func awakeFromNib() {
       super.awakeFromNib()
       // Initialization code
   }
   func setCell(imageName: String) {
       self.mainImage.image = UIImage(named: imageName)
   }
   
}
```
```swift
// ViewControllerクラス
class ViewController: UICollectionViewController, UICollectionViewDelegateFlowLayout {
   
   var screenHeight: CGFloat!
   var screenWidth: CGFloat!
   
   let screenNames = ["main01", "main02", "main03", "main09", "main02", "main03", "main09", "main02"]
   
   override func viewDidLoad() {
       super.viewDidLoad()
       let statusBar = UIView(frame:CGRect(x: 0.0, y: 0.0, width: UIScreen.main.bounds.width, height: 20.0))
       statusBar.backgroundColor = UIColor.white
       view.addSubview(statusBar)
       self.automaticallyAdjustsScrollViewInsets = false
       self.collectionView!.register(UINib(nibName: "CollectionViewCell", bundle: nil), forCellWithReuseIdentifier: "cell1")
       self.collectionView!.register(UINib(nibName: "CollectionViewCell2", bundle: nil), forCellWithReuseIdentifier: "cell2")
   }
   
   // 希望のセルサイズを返す
   func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
       
       let screenSize: CGRect = UIScreen.main.bounds
       screenWidth = screenSize.width
       screenHeight = screenSize.height
       let returnSize = CGSize(width: screenSize.width, height: screenSize.height)
       return returnSize
   }
   
   //セルのアイテムのマージンを設定
   func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets {
       return UIEdgeInsetsMake(20.0 , 0.0 , 0.0 , 0.0 ) //マージン(top , left , bottom , right)
   }
   
   //セル間のマージンを削除
   func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAt section: Int) -> CGFloat {
       return 0.0
   }
   
   //データの個数を返す
   override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int
   {
       return screenNames.count
   }
   
   //データを返す
   override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell
   {
       var cell: CommonCollectionViewCell!
       if(indexPath.row == 0 || indexPath.row == 1) {
           let cell1 = collectionView.dequeueReusableCell(withReuseIdentifier: "cell1", for: indexPath as IndexPath) as! CollectionViewCell
           cell1.setCell(imageName: screenNames[indexPath.row])
           cell = cell1
       }
       else {
           let cell2 = collectionView.dequeueReusableCell(withReuseIdentifier: "cell2", for: indexPath as IndexPath) as! CollectionViewCell2
           cell2.setCell(imageName: screenNames[indexPath.row])
           cell = cell2
       }
       return cell
   }
   // ボタンタップで実行されるメソッド
   @IBAction func modalView(_ sender: UIButton) {
       print("tapButtonA")
   }
   
   override func didReceiveMemoryWarning() {
       super.didReceiveMemoryWarning()
       // Dispose of any resources that can be recreated.
   }
}
```  
 
###コンソールでbtコマンドをたたいたときのログ  
 
```  
* thread #1: tid = 0x9380f, 0x0000000196863bdc libobjc.A.dylib`objc_msgSend + 28, queue = 'com.apple.main-thread', stop reason = EXC_BAD_ACCESS (code=1, address=0x110000)  
   frame #0: 0x0000000196863bdc libobjc.A.dylib`objc_msgSend + 28  
   frame #1: 0x000000018988d398 UIKit`-[UIApplication sendAction:to:from:forEvent:] + 96  
   frame #2: 0x0000000189876474 UIKit`-[UIControl _sendActionsForEvents:withEvent:] + 612  
   frame #3: 0x000000018988cd34 UIKit`-[UIControl touchesEnded:withEvent:] + 592  
   frame #4: 0x000000018988c9c0 UIKit`-[UIWindow _sendTouchesForEvent:] + 700  
   frame #5: 0x0000000189885efc UIKit`-[UIWindow sendEvent:] + 684  
   frame #6: 0x0000000189859120 UIKit`-[UIApplication sendEvent:] + 264  
   frame #7: 0x0000000189afa2b8 UIKit`_UIApplicationHandleEventFromQueueEvent + 15424  
   frame #8: 0x0000000189857634 UIKit`_UIApplicationHandleEventQueue + 1716  
   frame #9: 0x0000000184d98240 CoreFoundation`__CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 24  
   frame #10: 0x0000000184d974e4 CoreFoundation`__CFRunLoopDoSources0 + 264  
   frame #11: 0x0000000184d95594 CoreFoundation`__CFRunLoopRun + 712  
   frame #12: 0x0000000184cc12d4 CoreFoundation`CFRunLoopRunSpecific + 396  
   frame #13: 0x000000018e5df6fc GraphicsServices`GSEventRunModal + 168  
   frame #14: 0x00000001898bef40 UIKit`UIApplicationMain + 1488  
 * frame #15: 0x00000001000419f0 advicebook`main + 140 at AppDelegate.swift:12  
   frame #16: 0x0000000196efaa08 libdyld.dylib`start + 4  
```
  • Xcode

    6098 questions

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

  • Swift

    10783 questions

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

4 ソースコードの修正

退会済みユーザー

退会済みユーザー

2017/02/14 21:49  投稿

UICollectionView xibに配置したボタンをタップして画像をモーダル表示させたい
###前提・実現したいこと
xcode8 swift3 iPad
UICollectionViewを使用して、画像のスライドショーみたいなものを作っています。
各セルのサイズはフルスクリーンです。
各セルのレイアウトは違っていて、indexPathごとにカスタムセルでxibを使っています。
セルにボタンを配置してボタンをタップしたら、画像をモーダル表示したいです。
storyboardにViewControllerをUICollecitonViewを配置したものとは別に、新たに配置しています。
xibのボタンから新たに配置したViewControllerに遷移させたいです。
###発生している問題・エラーメッセージ
xibにボタンを配置しましたが、そこからのモーダル表示が上手くいきません。
UICollectionViewCellクラスからの遷移方法がわからず、色々と試していますが、上手くいっておりません。
selfのところでエラーとなっていますが、UICollectionViewクラスではないからと思いましたが、解決方法がわかっておりません。
###該当のソースコード
```swift
// カスタムセルクラス
class CollectionViewCell2: CommonCollectionViewCell {
   
   @IBOutlet weak var mainImage: UIImageView!
   
   override func awakeFromNib() {
       super.awakeFromNib()
       // Initialization code
   }
   func setCell(imageName: String) {
       self.mainImage.image = UIImage(named: imageName)
   }
   
}
```
```swift
// ViewControllerクラス
class ViewController: UICollectionViewController, UICollectionViewDelegateFlowLayout {
   
   var screenHeight: CGFloat!
   var screenWidth: CGFloat!
   
   let screenNames = ["main01", "main02", "main03", "main09", "main02", "main03", "main09", "main02"]
   
   override func viewDidLoad() {
       super.viewDidLoad()
       let statusBar = UIView(frame:CGRect(x: 0.0, y: 0.0, width: UIScreen.main.bounds.width, height: 20.0))
       statusBar.backgroundColor = UIColor.white
       view.addSubview(statusBar)
       self.automaticallyAdjustsScrollViewInsets = false
 
       self.collectionView!.register(UINib(nibName: "CollectionViewCell", bundle: nil), forCellWithReuseIdentifier: "cell1")  
       self.collectionView!.register(UINib(nibName: "CollectionViewCell2", bundle: nil), forCellWithReuseIdentifier: "cell2")  
   }
   
   // 希望のセルサイズを返す
   func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
       
       let screenSize: CGRect = UIScreen.main.bounds
       screenWidth = screenSize.width
       screenHeight = screenSize.height
       let returnSize = CGSize(width: screenSize.width, height: screenSize.height)
       return returnSize
   }
   
   //セルのアイテムのマージンを設定
   func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets {
       return UIEdgeInsetsMake(20.0 , 0.0 , 0.0 , 0.0 ) //マージン(top , left , bottom , right)
   }
   
   //セル間のマージンを削除
   func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAt section: Int) -> CGFloat {
       return 0.0
   }
   
   //データの個数を返す
   override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int
   {
       return screenNames.count
   }
   
   //データを返す
   override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell
   {
       var cell: CommonCollectionViewCell!
       if(indexPath.row == 0 || indexPath.row == 1) {
           self.collectionView!.register(UINib(nibName: "CollectionViewCell", bundle: nil), forCellWithReuseIdentifier: "cell1")  
           let cell1 = collectionView.dequeueReusableCell(withReuseIdentifier: "cell1", for: indexPath as IndexPath) as! CollectionViewCell
           cell1.setCell(imageName: screenNames[indexPath.row])
           cell = cell1
       }
       else {
           self.collectionView!.register(UINib(nibName: "CollectionViewCell2", bundle: nil), forCellWithReuseIdentifier: "cell2")  
           let cell2 = collectionView.dequeueReusableCell(withReuseIdentifier: "cell2", for: indexPath as IndexPath) as! CollectionViewCell2
           cell2.setCell(imageName: screenNames[indexPath.row])
           cell = cell2
       }
       return cell
   }
   // ボタンタップで実行されるメソッド
   @IBAction func modalView(_ sender: UIButton) {
       print("tapButtonA")
   }
   
   override func didReceiveMemoryWarning() {
       super.didReceiveMemoryWarning()
       // Dispose of any resources that can be recreated.
   }
}
```
  • Xcode

    6098 questions

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

  • Swift

    10783 questions

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

3 ソースコードの修正

退会済みユーザー

退会済みユーザー

2017/02/14 18:36  投稿

UICollectionView xibに配置したボタンをタップして画像をモーダル表示させたい
###前提・実現したいこと
xcode8 swift3 iPad
UICollectionViewを使用して、画像のスライドショーみたいなものを作っています。
各セルのサイズはフルスクリーンです。
各セルのレイアウトは違っていて、indexPathごとにカスタムセルでxibを使っています。
セルにボタンを配置してボタンをタップしたら、画像をモーダル表示したいです。
storyboardにViewControllerをUICollecitonViewを配置したものとは別に、新たに配置しています。
xibのボタンから新たに配置したViewControllerに遷移させたいです。
###発生している問題・エラーメッセージ
xibにボタンを配置しましたが、そこからのモーダル表示が上手くいきません。
UICollectionViewCellクラスからの遷移方法がわからず、色々と試していますが、上手くいっておりません。
selfのところでエラーとなっていますが、UICollectionViewクラスではないからと思いましたが、解決方法がわかっておりません。
###該当のソースコード
```swift
// カスタムセルクラス
class CollectionViewCell1: CommonCollectionViewCell {
class CollectionViewCell2: CommonCollectionViewCell {
   
   @IBOutlet weak var mainImage: UIImageView!
   @IBOutlet weak var buttonA: UIButton!  
   
   override func awakeFromNib() {
       super.awakeFromNib()
       // Initialization code
   }
   func setCell(imageName: String) {
       self.mainImage.image = UIImage(named: imageName)
       let buttonAImage = UIImage(named: "image01")  
       self.buttonA.setBackgroundImage(buttonAImage, for: .normal)  
       self.buttonA.setTitle("", for: UIControlState(rawValue: 0))  
   }
   
   @IBAction func modalA(_ sender: Any) {  
       print("tapButtonA")  
 
       // secondViewControllerのインスタンス生成.  
       let modalView = ModalViewController()  
         
       // navigationControllerのrootViewControllerにsecondViewControllerをセット.  
       let nav = UINavigationController(rootViewController: modalView)  
         
       // 画面遷移.  
       self.present(nav, animated: true, completion: nil)  
   }  
}
```
よろしくお願い致します。
```swift
// ViewControllerクラス
class ViewController: UICollectionViewController, UICollectionViewDelegateFlowLayout {
   
   var screenHeight: CGFloat!
   var screenWidth: CGFloat!
   
   let screenNames = ["main01", "main02", "main03", "main09", "main02", "main03", "main09", "main02"]
   
   override func viewDidLoad() {
       super.viewDidLoad()
       let statusBar = UIView(frame:CGRect(x: 0.0, y: 0.0, width: UIScreen.main.bounds.width, height: 20.0))
       statusBar.backgroundColor = UIColor.white
       view.addSubview(statusBar)
       self.automaticallyAdjustsScrollViewInsets = false
   }
   
   // 希望のセルサイズを返す
   func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, sizeForItemAt indexPath: IndexPath) -> CGSize {
       
       let screenSize: CGRect = UIScreen.main.bounds
       screenWidth = screenSize.width
       screenHeight = screenSize.height
       let returnSize = CGSize(width: screenSize.width, height: screenSize.height)
       return returnSize
   }
   
   //セルのアイテムのマージンを設定
   func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, insetForSectionAt section: Int) -> UIEdgeInsets {
       return UIEdgeInsetsMake(20.0 , 0.0 , 0.0 , 0.0 ) //マージン(top , left , bottom , right)
   }
   
   //セル間のマージンを削除
   func collectionView(_ collectionView: UICollectionView, layout collectionViewLayout: UICollectionViewLayout, minimumLineSpacingForSectionAt section: Int) -> CGFloat {
       return 0.0
   }
   
   //データの個数を返す
   override func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int
   {
       return screenNames.count
   }
   
   //データを返す
   override func collectionView(_ collectionView: UICollectionView, cellForItemAt indexPath: IndexPath) -> UICollectionViewCell
   {
       var cell: CommonCollectionViewCell!
       if(indexPath.row == 0 || indexPath.row == 1) {
           self.collectionView!.register(UINib(nibName: "CollectionViewCell", bundle: nil), forCellWithReuseIdentifier: "cell1")
           let cell1 = collectionView.dequeueReusableCell(withReuseIdentifier: "cell1", for: indexPath as IndexPath) as! CollectionViewCell
           cell1.setCell(imageName: screenNames[indexPath.row])
           cell = cell1
       }
       else {
           self.collectionView!.register(UINib(nibName: "CollectionViewCell2", bundle: nil), forCellWithReuseIdentifier: "cell2")
           let cell2 = collectionView.dequeueReusableCell(withReuseIdentifier: "cell2", for: indexPath as IndexPath) as! CollectionViewCell2
           cell2.setCell(imageName: screenNames[indexPath.row])
           cell = cell2
       }
       return cell
   }
   // ボタンタップで実行されるメソッド
   @IBAction func modalView(_ sender: UIButton) {
       print("tapButtonA")
   }
   
   override func didReceiveMemoryWarning() {
       super.didReceiveMemoryWarning()
       // Dispose of any resources that can be recreated.
   }
}
### 追記  
カスタムセルクラス  
```swift  
 
let view = ViewController()  
 
@IBAction func modalA(_ sender: Any) {  
   print("tapButtonA")  
   view.modalView()  
}  
```  
 
 
ViewControllerクラス  
```swift  
func modalView() {  
   let modalView = ModalViewController()  
   // 画面遷移.  
   self.present(modalView, animated: true, completion: nil)  
}  
```
  • Xcode

    6098 questions

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

  • Swift

    10783 questions

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

2 ソースの追記

退会済みユーザー

退会済みユーザー

2017/02/13 18:01  投稿

UICollectionView xibに配置したボタンをタップして画像をモーダル表示させたい
###前提・実現したいこと
xcode8 swift3 iPad
UICollectionViewを使用して、画像のスライドショーみたいなものを作っています。
各セルのサイズはフルスクリーンです。
各セルのレイアウトは違っていて、indexPathごとにカスタムセルでxibを使っています。
セルにボタンを配置してボタンをタップしたら、画像をモーダル表示したいです。
storyboardにViewControllerをUICollecitonViewを配置したものとは別に、新たに配置しています。
xibのボタンから新たに配置したViewControllerに遷移させたいです。
###発生している問題・エラーメッセージ
xibにボタンを配置しましたが、そこからのモーダル表示が上手くいきません。
UICollectionViewCellクラスからの遷移方法がわからず、色々と試していますが、上手くいっておりません。
selfのところでエラーとなっていますが、UICollectionViewクラスではないからと思いましたが、解決方法がわかっておりません。
###該当のソースコード
```swift
// カスタムセルクラス
class CollectionViewCell1: CommonCollectionViewCell {
   
   @IBOutlet weak var mainImage: UIImageView!
   @IBOutlet weak var buttonA: UIButton!
   
   override func awakeFromNib() {
       super.awakeFromNib()
       // Initialization code
   }
   func setCell(imageName: String) {
       self.mainImage.image = UIImage(named: imageName)
       let buttonAImage = UIImage(named: "image01")
       self.buttonA.setBackgroundImage(buttonAImage, for: .normal)
       self.buttonA.setTitle("", for: UIControlState(rawValue: 0))
   }
   
   @IBAction func modalA(_ sender: Any) {
       print("tapButtonA")
       // secondViewControllerのインスタンス生成.
       let modalView = ModalViewController()
       
       // navigationControllerのrootViewControllerにsecondViewControllerをセット.
       let nav = UINavigationController(rootViewController: modalView)
       
       // 画面遷移.
       self.present(nav, animated: true, completion: nil)
   }
}
```
よろしくお願い致します。
よろしくお願い致します。
### 追記
カスタムセルクラス
```swift
let view = ViewController()
@IBAction func modalA(_ sender: Any) {
   print("tapButtonA")
   view.modalView()
}
```
ViewControllerクラス
```swift
func modalView() {
   let modalView = ModalViewController()
   // 画面遷移.
   self.present(modalView, animated: true, completion: nil)
}
```
  • Xcode

    6098 questions

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

  • Swift

    10783 questions

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

1 タイトルの修正

退会済みユーザー

退会済みユーザー

2017/02/13 14:53  投稿

xibに配置したボタンをタップして画像をモーダル表示させたい
UICollectionView xibに配置したボタンをタップして画像をモーダル表示させたい
###前提・実現したいこと
xcode8 swift3 iPad
UICollectionViewを使用して、画像のスライドショーみたいなものを作っています。
各セルのサイズはフルスクリーンです。
各セルのレイアウトは違っていて、indexPathごとにカスタムセルでxibを使っています。
セルにボタンを配置してボタンをタップしたら、画像をモーダル表示したいです。
storyboardにViewControllerをUICollecitonViewを配置したものとは別に、新たに配置しています。
xibのボタンから新たに配置したViewControllerに遷移させたいです。
###発生している問題・エラーメッセージ
xibにボタンを配置しましたが、そこからのモーダル表示が上手くいきません。
UICollectionViewCellクラスからの遷移方法がわからず、色々と試していますが、上手くいっておりません。
selfのところでエラーとなっていますが、UICollectionViewクラスではないからと思いましたが、解決方法がわかっておりません。
###該当のソースコード
```swift
// カスタムセルクラス
class CollectionViewCell1: CommonCollectionViewCell {
@IBOutlet weak var mainImage: UIImageView!
@IBOutlet weak var buttonA: UIButton!
override func awakeFromNib() {
super.awakeFromNib()
// Initialization code
}
func setCell(imageName: String) {
self.mainImage.image = UIImage(named: imageName)
let buttonAImage = UIImage(named: "image01")
self.buttonA.setBackgroundImage(buttonAImage, for: .normal)
self.buttonA.setTitle("", for: UIControlState(rawValue: 0))
}
@IBAction func modalA(_ sender: Any) {
print("tapButtonA")
// secondViewControllerのインスタンス生成.
let modalView = ModalViewController()
// navigationControllerのrootViewControllerにsecondViewControllerをセット.
let nav = UINavigationController(rootViewController: modalView)
// 画面遷移.
self.present(nav, animated: true, completion: nil)
}
}
```
よろしくお願い致します。
  • Xcode

    6098 questions

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

  • Swift

    10783 questions

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

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る