あなたの習慣について教えてください!!

ObjectiveCを用いてiPhone用アプリの開発の勉強をしています。

画面簡易でNavigationControllerを使っているのですが、そこで不具合のような現象が発生しました。
NavigationControllerをInitialViewControllerに設定、その下にViewControllerをpush接続し、
ViewControllerのNavigationBarにボタンを設置しました。
そのボタンをちょっと動かそうと思いNavigationBarの外に置いたところ、ViewControllerの左下の方に固定されてしまい、動かせなくなりました。

ちなみに、TabBarControllerも使っています。
NavigationControllerと並列で、さらにNavigationControllerを使用しています。
これがバグの原因なのでしょうか?
実行してみると、そのボタンは画面下部のタブに隠れて、見えません。


storyboard左のメニューからそのボタンを選択し、Edit→Deleteをしようと思いましたが、Deleteがグレーになっていて、選択できません。

このような状態になった場合、どうしたら問題を解決できるのでしょうか?

そのボタンを複製し、NavigationBarに再度設置すると、問題なく動きますが、その動かせないボタンは残ったままで、後々のバグの原因になるのでないかと、不安です。

アドバイスお願いします。

「NavigationController」の質問画像

A 回答 (2件)

> NavigationControllerをInitialViewControllerに設定、その下にViewControllerをpush接続し、



念のため確認ですが、ここは「ViewControllerをpush接続」ではなく、
「ViewControllerをRelationshipのroot viewとして接続」の誤りだと
思ってよいでしょうか?
NavigationControllerには、少なくともrootViewControllerを設定しないと
機能できないと思うのですが、もしかして、それは別途やっていて、
それに加えてpush接続もあるということなのでしょうか?(だとしたら余計に
意味がわかりません)。

> ちなみに、TabBarControllerも使っています。

これも確認したいのですが、NavigationControllerをInitialViewControllerに
した上で、NavigationController配下にTabBarControllerコントローラーが
配置されているのですか?
そのTabBarControllerはどのViewControllerから呼び出されるのでしょうか?

> NavigationControllerと並列で、さらにNavigationControllerを使用しています。

最初に「NavigationControllerをInitialViewControllerに設定」と書いてあるのに
ここでは、TabBarController配下に並列で複数のNavigationControllerがあるかのように
見えます。InitialViewControllerに設定したものとは別に複数のNavigationController
がTabBarController配下にあるのでしょうか?
それとも最初の説明とは別のものを説明しているのでしょうか?

このあたりの接続状況をもっとちゃんと説明してもらえると何かわかるかも
しれません。


で、結局構成がよくわからないのですが、なんとなくNavigationControllerの
Attributes Inspectorで「Shows Toolbar」が意図せずチェックONになっている
ような気がしました。
ただ、そのボタンを削除しようとしても削除できないというのは理由がよくわかりません。
選択したように見えて選択されてないという話はないのでしょうか?
もし「Shows Toolbar」がONになっていたなら、それをOFFにすればToolBarは
消えるかもしれませんが、そのToolBarに張り付いていたボタンは画面上
見えないところで残っている可能性があります。
その場合でもStoryboardの左側に部品をツリー上に表示している「Document Outline」
には見えているはずなので、そこで部品を選択して削除すればよいと思います。
    • good
    • 0
この回答へのお礼

回答ありがとうございます!

すみません、言葉の認識が甘く、間違っていて分かりづらい書き方になってしまいました。
回答を参考に触っていた所、問題が解決できたました。

まず構成の訂正から

ViewControllerをRelationshipのroot viewとして接続というのが正しかったです。
そしてinitialViewControllerはTabBarControllerでした。

[TabBarController]-[NavigationController]-[ViewController]-[Viewcontroller]-...

という感じで接続されています。

Show Toolbarは確認したところチェックされていませんでした。

症状としては
一度上部のセルに乗せたボタンが固定化され、StoryBoard上で名前の編集はできるものの、移動したり削除したりという事ができない
また、移動できた場合も、ViewControllerの下部に固定化されてしまい、同様の現象が起こる(質問に添付した画像のような状態)
という感じでした。

これはボタンがBarBottonItemという所に勝手に格納?されてしまっていたようです。
Document Outlineからボタンを選択しても削除やカットができなかったのですが、そのBarBottonItemという項目ごとであれば、削除・カットすることが出来ました。

バグがあったりエラーが起こるようなら、コードでボタンを追加すればいいかなと思いましたが、segue移動をコードで書くと見にくくなるなと感じたり
http://dev.classmethod.jp/smartphone/iphone/ios_ …
のようなExitの機能も使いたいと思っていたので助かりました^^
特にバグという事も無かったようなので良かったです。

お礼日時:2014/09/10 01:39

> これはボタンがBarBottonItemという所に勝手に格納?されてしまっていたようです。


> Document Outlineからボタンを選択しても削除やカットができなかったのですが、そのBarBottonItemという項目ごとであれば、削除・カットすることが出来ました。

ここらへんは、ちょっと認識に誤りがあります。
UIButtonと、UIBarButtonItemは、別のクラスであることを、まず覚えてください。View上に配置するものをUIButton、Navigation Bar、Tool Barに配置するものを、UIBarButtonItemといいます。外見がおなじなので、区別できなかったのも無理ありませんが、Storyboardにおいては、Object Libraryの下のほうにスクロールしていくと、部品として用意されていますので、ご自身の目でおたしかめください。そして今後は、Navigation BarやTool Barには、UIButtonではなく、UIBarButtonItemを配置してください。

話はもうすこし続きます。
しかし、あなたは、Storyboardで、UIButtonをNavigation Barの上にドラッグして、じっさいに配置できました。私のいっていることは違いますね?どういうことでしょう?
UIBarButtonItemのクラスリファレンスを読んでください。プロパティ「customView」が見つかります。このcustomViewを使うと、ボタン以外の、いろんなコントロールが、Navigation Bar、Tool Barに配置できます。たとえば、Navigation BarにUIActivityIndicatorViewを配置して、処理中であることを知らせるのは、よくあるインターフェイスですね。
Storyboardでなく、プログラムでNavigation BarにUIActivityIndicatorViewを直接配置することができません。いったんUIBarButtonItemをNavigation Barに配置してから、UIBarButtonItemのプロパティcustomViewにUIActivityIndicatorViewを代入することで、可能になります。
このようなプログラムのUIの構造を理解すれば、Storyboardの挙動も理解できると思います。ButtonがUIBarButtonItemごとでないと、削除できないのも、納得がいくのではないでしょうか?
すくなくとも、UIBarButtonItemのcustomViewにUIButtonを配置するのは、むだではありますね。
    • good
    • 0
この回答へのお礼

回答ありがとうございます!お礼が遅くなり申し訳ありません。

NavigationBarにはそれ用のボタンがあるのですね。全く知りませんでした;
リファレンスは英語が読めず、あまり理解できません。。。
虎の巻というところを、参考にしています。

しかしcustomViewというのがいまいち検索をしてもそれらしい物がヒットせず、理解できませんでした。
UIActivityIndicatorViewは特にタップ処理の無い物だと思いますが、そういうものでもUIBarButtonItemを使って設置するんですね
本来は
>いったんUIBarButtonItemをNavigation Barに配置してから、UIBarButtonItemのプロパティcustomViewにUIActivityIndicatorViewを代入することで、可能になります。
といった処理をしないといけないのに、それを飛ばしてしまっているからバグのような挙動になってしまうという事でしょうか?

Buttonとして使いたいのであれば、UIBarButtonItemをそのまま使い、
Button以外のコントロールを実装したい場合は、UIBarButtonItemのcustomViewプロパティに何らかの処理を加える事で可能になる。
万が一UIBarButtonItemに出来なくてButtonなら出来る処理(あるのか分かりませんが)があった場合は、UIBarButtonItemのcustomViewにButtonを配置すれば良い
という考えで良いのでしょうか?

NavigationBarにUIActivityIndicatorViewを設置してみようと試してみたのですが
>UIBarButtonItemのプロパティcustomViewにUIActivityIndicatorViewを代入することで、可能になります。
ここら辺の、特にcustomViewプロパティの使い方がわからず、出来ませんでした;

いずれ実装する機会は必ずあるので、customViewの使い方も習得しておきたいですね。
まだ完璧には理解できていませんが、理解度は進みました!
NavigationBar上のボタンを全てBarButtonItemに変えてみましたが、今のところButtonを設置した時のようなおかしい?動きは見られなくなりました^^

お礼日時:2014/09/14 01:12

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!