3

背景を説明するために、私はUINavigationControlledベースのブログタイプのアプリを作成しています(iPhoneのFacebookアプリに最もよく似ていると思います)。現在アクティブなビューに関係なく、NavigationBarのタイトル領域には、友達リクエストやアクティビティ通知などのボタンがいくつか表示されます。Facebookアプリとほぼ同じように、これらのボタンをクリックするとポップアップビューが作成されます。

現在、私は信じられないほど非効率的だと感じる方法で物事を行っています。ロードされるすべてのビューについて、ボタンを再作成してナビゲーションバーに追加しています。私のコードは以下の通りです:

//Setup the custom middle buttons
UIView *container = [[UIView alloc] init];
container.frame = CGRectMake(0, 0, 80, 44);

// create a button and add it to the container
UIButton *notificationButton = [UIButton buttonWithType:UIButtonTypeCustom];
notificationButton.frame = CGRectMake(0, 0, 35, 44);
[notificationButton addTarget:self 
                       action:@selector(showNotifications:) 
             forControlEvents:UIControlEventTouchUpInside];
[container addSubview:notificationButton];


// add another button to the container
UIButton *friendActivityButton = [UIButton buttonWithType:UIButtonTypeCustom];
friendActivityButton.frame = CGRectMake(45, 0, 35, 44);
[friendActivityButton addTarget:self 
                         action:@selector(showFriendActivity:) 
               forControlEvents:UIControlEventTouchUpInside];
[container addSubview:friendActivityButton];

// Set the titleView to the container view
[self.navigationItem setTitleView:container];
[container release];

私のアプリには複数のビューがあり、ナビゲーションバーは常に表示されているため、ボタンを再作成してコンテナビューに追加し、そのビューをナビゲーションコントローラーのtitleViewに追加し続けるのはばかげているようです。

同じ効果を達成するためのより良い方法は何でしょうか?UINavigationBarのサブクラス化またはカテゴリの作成を検討していて、そこにコンテナビューコードを追加している可能性があります。しかし、このような場合にセレクターを機能させる方法がわかりませんでした。また、UINavigationBarカテゴリを使用してtitleViewプロパティにアクセスする方法もわかりませんでした。

これに関するどんな助けも素晴らしいでしょう!ありがとうございました!

4

1 に答える 1

2

上記のコードをUIViewControllerカテゴリ (またはUIViewController単一のルートからすべてのビュー コントローラーをサブクラス化できる場合はサブクラス) に入れることをお勧めします。次に でviewDidAppear、上記のコードを呼び出す (またはそれをスーパークラスの に入れるviewDidAppear) だけです。UINavigationBarサブクラス化は、価値があるよりも面倒になると思います。

ボタンの再作成を本当に避けたい場合 (おそらくそうする理由はありませんが、何らかの理由でそれが重要な場合)、ボタンを にポイントするのではなく、シングルトン オブジェクトにワイヤリングできますself。シングルトンは、応答を直接処理するか、メッセージをアクティブ ビュー コントローラーに転送するか、アクティブ ビュー コントローラーがリッスンできる通知を投稿することができます。

于 2012-04-04T14:28:36.977 に答える