1

アプリでNavigationControllerのツールバーを使用しようとしています。このツールバーのtoolbarItemsは、表示されるViewControllerに応じて変更されると想定されています。これは非常に基本的なことです。

私がやろうとしているのは、UIBarButtonItemの「initWithCustomView:」メソッドを使用してツールバーにカスタムボタンを追加することです。ただし、ボタンはツールバーに表示されません。しかし、「initWithTitle:」または「initWithBarButtonSystemItem:」メソッドを使用してUIBarButtonItemを作成すると、ボタンが表示されます。たとえば、次のコードを見てください。

UIBarButtonItem *item1 = [[UIBarButtonItem alloc] initWithBarButtonSystemItem: UIBarButtonSystemItemBookmarks target:self action:nil];
UIBarButtonItem *item2 = [[UIBarButtonItem alloc] initWithTitle:@"edit" style:UIBarButtonItemStylePlain target:self action:nil];

NSArray *array = [[NSArray alloc] initWithObjects:item1, item2, nil];
[self setToolbarItems:array];

これを行うと、ツールバーにボタンが表示されます。しかし、私が次のことを行うとしたら:

UIButton* replyBtn = [UIButton buttonWithType:UIButtonTypeCustom];
[replyBtn setImage:[UIImage imageNamed:@"Reply_Message.png"] forState:UIControlStateNormal];
[replyBtn addTarget:self action:@selector(replyButtonTapped:) forControlEvents:UIControlEventTouchUpInside];
replyBtn.frame = CGRectMake(10, 0, 40, 40);
UIBarButtonItem *replyButton = [[UIBarButtonItem alloc] initWithCustomView:replyBtn];

UIBarButtonItem *item1 = [[UIBarButtonItem alloc] initWithBarButtonSystemItem: UIBarButtonSystemItemBookmarks target:self action:nil];
UIBarButtonItem *item2 = [[UIBarButtonItem alloc] initWithTitle:@"edit" style:UIBarButtonItemStylePlain target:self action:nil];

NSArray *array = [[NSArray alloc] initWithObjects:item1, replyButton, item2, nil];
[self setToolbarItems:array];

このコードでは、item1とitem2のみがツールバーに表示されます。replyButtonはツールバーに表示されません。ボタンがあるはずの場所に空白があります。

これと同じコードを、NavigationControllerのツールバーの代わりに作成した通常のツールバーで使用すると、ボタンが表示されます。私は、Appleのメールアプリケーションと同じ感覚を持たせるために、アプリ全体で1つのツールバーを使用しようとしています。「initWithCustomView:」メソッドを使用する必要がある理由は、アイコンの1つが色付きであり、これが通常のツールバーに色付きで表示される唯一の方法であるためです。今、私はアップルのドキュメントを調べましたが、「initWithCustomView:」メソッドを呼び出せなかった(または見つからなかった)理由については何も言及されていません。

私が正しい方向を示すのを助けるために、誰かがこのトピックに光を当ててください。よろしくお願いします。

4

4 に答える 4

1

私も同じ問題を抱えていました。UINavigationControllerのツールバーは、新しいビューがスタックにプッシュされるたびにアイテムをリセットすることがわかりました。applicationDidFinish関数でツールバー項目を設定しようとしましたが、機能しませんでした。ナビゲーションスタックにプッシュされていたviewControllerの-(void)viewDidAppear関数でツールバーのitmsを設定すると、機能しました。

したがって、ナビゲーションコントローラでアプリケーション全体で同じツールバー項目を保持する場合は、ビューが表示された後にナビゲーションコントローラにプッシュする各ビューでツールバー項目を設定する必要があるようです。

お役に立てば幸いです。

于 2012-08-01T21:04:52.367 に答える
1

あなたが試したものとの違いはわかりませんが、最終的にはそのコードでうまくいきました:

 //////////////////////////////////////////////////////////////////////////////////////////////
/////>>>> Adding buttons for browsing in the toolbar of the popover's navigation controller///
//////////////////////////////////////////////////////////////////////////////////////////////

//>>>>Create a goBack button    
goBack = [UIButton buttonWithType:UIButtonTypeCustom];
UIImage *goBackImage = [UIImage imageNamed:@"back1.png"];
[goBack setImage:goBackImage forState:UIControlStateNormal];
[goBack addTarget:self action:@selector(goBackClicked:) forControlEvents:UIControlEventTouchUpInside];
goBack.frame = CGRectMake(0,0,goBackImage.size.width,goBackImage.size.height);
//Create a Bar button to hold this button
UIBarButtonItem *goBackBarButton = [[[UIBarButtonItem alloc] initWithCustomView:goBack] autorelease]; 

UIBarButtonItem *flex1 = [[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace target:nil action:nil] autorelease];
UIBarButtonItem *addButton = [[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemRewind target:nil action:nil] autorelease];
NSArray *arrayOfButtons = [[[NSArray alloc] initWithObjects:goBackBarButton, flex1, addButton, nil] autorelease];
[self setToolbarItems:arrayOfButtons];

あなたのものとのいくつかの違いに注意してください(おそらくそこが問題ですか?よくわかりません):1.私のボタンはメソッドでローカルに割り当てられていませんが、クラスで割り当てられています(プロパティ、合成など)2.あなたのもの

[replyBtn setImage:[UIImage imageNamed:@"Reply_Message.png"] forState:UIControlStateNormal];

私のは少し違うように見えるところ

[goBack setImage:goBackImage forState:UIControlStateNormal];

これらの小さな変更を試してみてください。うまくいくかもしれません:)

于 2011-03-30T07:37:25.837 に答える
0

ビューに何も含まれていないため、アイテムが表示されていないと推測します。プロジェクトで呼び出されたイメージがあると確信していReply_Message.pngますか? [UIImage imageNamed:@"Reply_Message.png"]かもしれませんnil

于 2010-07-28T03:08:09.167 に答える
0

ナビゲーション コントローラーのツールバーを使用せずに、アプリ全体で 1 つのツールバーを使用できます。あなたのコードは非 navigationController ツールバーで動作するので、これが目的を達成する最も簡単な方法かもしれません。アプリ デリゲートで、次のようにウィンドウにツールバーを追加してみてください。このようにして、アプリ全体で永続化されます。ツールバーにアクセスしてボタンを追加/削除したり、別のビュー コントローラーから非表示/表示したりできるスキームを検討してください。

    - (BOOL)application:(UIApplication *)application 
didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {  

    /////// frame sizes ////////
    // compensate for the status bar
    int statusBarHeight = 20;

    // toolbar
    int toolbarWidth   = window.frame.size.width;
    int toolbarHeight  = 30;  // I think standard size is 30
    int toolbarxOffset = 0;
    int toolbaryOffset = window.frame.size.height - tHeight;
    CGRect toolbarFrame = CGRectMake(toolbarxOffset,
                                     toolbaryOffset,
                                     toolbarWidth,
                                     toolbarHeight);

    /////// toolbar //////////////////////
    self.myPersistentToolbar = [[UIToolbar alloc] initWithFrame:toolbarFrame];
    [window addSubview:self.myPersistentToolbar];
}
于 2010-08-20T00:20:12.863 に答える