質問編集履歴

1 参考にした記事のリンクを貼り忘れていたので追加しました。

yamataku29

yamataku29 score 47

2017/03/05 17:24  投稿

UITabbarControllerにモーダル表示するボタンを追加
UITabbarControllerの中でtabbaritemを5つ作成し、左から3番目の真ん中のtabbaritemの上にsubviewを載せてボタン化して、それを押したらViewControllerをモーダル表示する。
というのを下記の記事を参考に試しているのですが、なかなか上手く行かず、、
[小ネタ:UITabBarControllerに「モーダル表示するボタン」を追加する(Swift)](http://qiita.com/paming/items/a1413480358fa81728cf)  
 
↑の記事のコードをswift3に適用させつつ実装しており、エラーなどは一通り修正したのですが、tabbarの上に載せたsubviewの出現と、指定したViewControllerのモーダル表示ができず、苦戦しています。
原因分かる方いらっしゃればアドバイス貰えるとうれしいです。
よろしくお願いします。
```
import UIKit
class MainTabBarViewController: UITabBarController {
   
   let modalButton: UIButton = UIButton()
   override func viewDidLoad() {
       super.viewDidLoad()
       
//       PostViewをModal表示させる
       let image = UIImage(named: "modalButton")
       self.modalButton.setBackgroundImage(image, for: .normal)
       self.modalButton.addTarget(self, action: "openModal", for: UIControlEvents.touchUpInside)
       self.tabBar.addSubview(self.modalButton)
       
       var viewControllerArray = [UIViewController]()
       
//1つ目のtab
       let currentInfoStoryboard = UIStoryboard(name: "CurrentInfoStoryboard", bundle: nil)
       
       guard let currentInfoNavigationViewController = currentInfoStoryboard.instantiateInitialViewController() else {
           // FIXME: send error report
           return
       }
       
       viewControllerArray.append(currentInfoNavigationViewController)
     
//2つ目のtab
       let monthlyTabBarStoryboard = UIStoryboard (name: "MonthlyGraph", bundle: nil )
       
       guard let monthlyGraph = monthlyTabBarStoryboard.instantiateInitialViewController() else {
           return
       }
       
       viewControllerArray.append(monthlyGraph)
//3つ目のtab     
       let postStoryboard = UIStoryboard(name: "PostStoryboard", bundle: nil)
       
       guard let postViewController = postStoryboard.instantiateInitialViewController() else {
           // FIXME: send error report
           return
       }
       
       viewControllerArray.append(postViewController)
       
//4つ目のtab
       let appinfostoryboard = UIStoryboard(name: "AppInfo", bundle: nil)
       
       guard let appInfoViewController = appinfostoryboard.instantiateInitialViewController() else {
           return
       }
       viewControllerArray.append(appInfoViewController)
       
//5つ目のtab
       let profileStoryboard = UIStoryboard(name: "ProfileStoryboard", bundle: nil)
       
       guard let profileViewController = profileStoryboard.instantiateInitialViewController() else {
           // FIXME: send error report
           return
       }
       
       viewControllerArray.append(profileViewController)
       
       self.viewControllers = viewControllerArray
   }
   
//subviewのレイアウト指定
   override func viewDidLayoutSubviews() {
       let v = self.tabBarButtons()?[2]
       if let v = v {
           self.modalButton.frame = v.frame
       }
       
//モーダル表示の関数
       func openModal() {
           let vc = (self.storyboard?.instantiateViewController(withIdentifier: "PostStoryboard"))! as UIViewController?
           if let vc = vc {
               self.present(vc, animated: true, completion: nil)
           }
       }
   }
extension UITabBarController {
   func tabBarButtons() -> [UIView]? {
       return self.tabBar.subviews.reduce([], {(ret: [UIView], item:AnyObject) -> [UIView] in if let v = item as? UIView {
           if v.isKind(of: NSClassFromString("UITabBarButton")!) {
               return ret + [v]
           }
           }
           return ret
       })
   }
}
```
  • Swift

    13987 questions

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

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