これが解決法なんだけどどこをかきかえりゃいいんだ!
rabbit2goさんありがとうございました。無事解決しました。
あーでもやっぱOCMock使おうとすると同じの出るなぁ。どこの設定をいじくればよいのかいまいちわからんな。。。うーむ。
http://d.hatena.ne.jp/glass-_-onion/20100802/1280758789
http://d.hatena.ne.jp/coizne/20100909/1283988193
後デザイン関係
http://kachibito.net/marketing/40-minimal-business-card-dessign.html
ここら辺みてかっちょいいかんじのつくれないかなー。昔はてなのテーマ作ってたときもこんな感じのに(色は)最終的に収まって行った気はするけどどうも二次元配置能力が低いようだ...
オブジェクトを列挙してNSArrayを作りたい - initWithObjects:
- (id)initWithObjects:(id)firstObj, ...
オブジェクトを順番に列挙してゆくことで、それらを格納したNSArrayを作ります。列挙したオブジェクトには順番に0, 1, 2,
…とインデックスが割り当てられます。一番最後にnilを指定します。このメソッドはUISegmentControlの要素を作るのによく使われます。
以下の例は3つに分かれたUISegmentControlを作る時のコードの一部です。
NSArray *items = [[NSArray alloc] initWithObjects:@"少ない",@"中程度",@"多い",nil]; UISegmentControl *sControl = [[UISegmentedControl alloc]initWithItems:items]; [items release];NSArrayについて
ピンポイントすぐる。
ということでいろいろ試した。
PopoverはUIPopoverControllerオブジェクトを利用する。で、このオブジェクトはIBにはないので、コードで書かなきゃいけない(ということに気づくまでかなりかかった)わけで。だがIBを使わない方法がわからない初心者にとっては(ry
UIPopoverControllerは中にたいていのViewは取り込めてしまう模様。インスタンスを作るときは
UIViewController* targetView = [[[UIViewController alloc]init] autorelease]; UIPopoverController* popover = [[UIPopoverController alloc]initWithCOntentViewController:targetView];
UIViewControllerの作り方ってこれでいいんだっけ;あとでテーブルヴューの場合で書いときます。
表示に際しては自分でデリゲートを受け取ってやる必要があるようです。たぶん。
popover.delgate = self.view;
警告が出てるのでなんかもっとやり方があるのかも。
実際に表示させるところは
if(!popover.popoverVisible){ [popover presentPopoverFromBarButtonItem:self.navigationItem.rightBarButtonItem permittedArrowDirections:UIPopoverArrowDirectionUp animated:YES]; }
この場合はメインのナビゲーションバーの右側のアイテムをタップすると表示されるようになっています。こまけぇことはまだわかりませんorz
とりあえずよくあるようにpopoverにTableView上のメニューを表示させるやり方。表示だけでpopoverの中で何か操作ができる訳ではありません。
//TableViewを作る UITableView* tableView = [[UITableView alloc]initWithFrame:CGRectMake(0,0,300,300) style:UITableViewStylePlain]; //TableViewControllerを作る UITableViewController *settingVC = [[UITableViewController alloc]initWithStyle:UITableViewStylePlain]; //ControllerとViewをくっつける [settingVC.view addSubview:tableView]; //とりあえずNavigation Barもつけておく NSString* settings = NSLocalizedString(@"Settings", @"Settings"); UINavigationController* theNavController = [[UINavigationController alloc]initWithRootViewController:settingVC]; theNavController.navigationBar.topItem.title = settings; [theNavController setNavigationBarHidden:NO]; [theNavController setToolbarHidden:NO]; //イベントが来たら表示する popover = [[UIPopoverController alloc]initWithCOntentViewCOntroller:theNavController]; popover.delegate = self.view; [settingVC release]; [theNavController release]; [tableView release]; [listOfContents release]; //popoverが表示されていなかったら表示する if(!popover.popoverVisible){ [popover presentPopoverFromBarButtonItem:self.navigationItem.rightBarButtonItem permittedArrowDirections:UIPopoverArrowDirectionUp animated:YES]; } [popover release];
その場でオブジェクトつくって表示させていますが、popoverとかtableViewとかその他諸々はインクルードファイルの法で作るべきかとはおもいます。
http://www.hirano-dept.com/blog/2010/02/iphone-uicolor.html
16進数で指定。
#define HEXCOLOR(c) [UIColor colorWithRed:((c>>16)&0xFF)/255.0 green:((c>>8&0xFF)) /255.0 blue:(c&0xFF)/255.0 alpha:1.0]
色見本
個人的には一番ここが好き。
Visual StudioでいうところのコントロールにNameを指定すれば、同じクラスの中ではNameにアクセスすればプロパティ見たり操作したりできる、っていうのをどうやってすればいいんだ!!!Nameってあるけどなんかオブジェクトとして使えるわけじゃないし…とかって悩んでたんだけどやっと解決した。
//hoge.h @interface hoge:UIViewController{ IBOutlet UILabel *message; IBOutlet UIView *view1; } @end
//hoge.m - (void)viewDidLoad{ [super viewDidLoad]; //IB使う場合 message.txt = @"MESSAGE"; [view1.layer setCornerRadius:10.0]; [view1.layer setBorderColor:[[UIColor grayColor]CGColor]]; //IB使わない場合(view1に貼り付けてみる) UILabel *message2 = [[[UILabel alloc]initWithFrame:CGRectMake(0,0,100,30)] autorelease]; message2.text = @"MESSAGE2"; [view1 addSubview:message2]; [message2 release]; }
IBのほうで作った部品はFile's Ownerから部品へ対応するOutletでリンクすること。これでオブジェクトとコントロールが結びつく。
はー。すげー基本的なことだとはわかってるんだけど、こういうのがわからんのだよなあ。
やっとできたー。本のとおりから少し変形したらできなくなるとか…もうね…orz
XxxAppDelegate.hで、
/*XxxAppDelegate.h*/ @interface XxxAppDelegate : NSObeject<UIApplicationDelegate>{ UIWindow *window; UIViewController *controller; }
/*XxxAppDelegate.h*/ @synthesize controller; (中略) controller = [[MainViewController alloc]initWithNibName:@"MainView" bundle:[NSBundle mainBundle]];
って宣言してたんだけどインクルードファイルが問題だった様子。貼り付けるViewのサブクラスをMainViewControllerとするとき、ここはUIViewControllerではなくMainViewControllerとすべき、らしい。
ここをUIViewControllerにしていると、"loaded the "*" nib but the view outlet was not set."とか"unrecognized selector sent to instance xxx"とかいわれるらしい。前者のほうは違う原因の気もするけれども…。
navigator = [[TestViewController alloc]initWithNibName:@"Navigator" bundle:[NSBundle mainBundle]]; if(navigator != nil){ [self.view addSubview:navigator.view]; }
ってやってて表示されないのでどうしたものかと。selfはただのUIView何ですがほんとは別のところに貼り付けたかったりするんだけれども。。。うーぬ。
んでUIView.hみたらhasViewControllerとかisInAWindowというフラグが定義されていたので使えるのかな?と思って
#ifdef DEBUG NSLog(@"self has view Controller?:%@\n", self.view->_viewFlag.hasViewController); #endif
とやってみたんだけどエラーが表示されて見れず。packageだからだめなのか…?わからーん。
ほか参考:
viewにviewスンナ:http://iphone-dev.g.hatena.ne.jp/iseebi/20100705/1278345640
ええとそしてどうすればよいのだorz
http://d.hatena.ne.jp/sugyan/20091213/1260708978
C#でもよくわかってないのに…(使えるけど)。setDelegateを使ってるのは実装忘れを防ぐためなのかな?
delegateを使おうとしてるのはこういうわけです。
http://ishidak.blogspot.com/2010/06/iphone-expected-specifier-qualifier.html
http://gist.github.com/586296