0

現在、アプリ用のスライダー (Facebook アプリと同様) を作成しています。スライダーの上部には検索ボックスがあり、検索機能を制御するメソッドもアプリ デリゲート内にあります。

同様に、別のクラス (SliderMenuViewController) にスライダーのテーブル ビューを制御するメソッドがあります。

スライダー(検索ボックスまたはテーブルビューセルのいずれか)がRootViewController(または現在表示されているviewController)に新しいViewController(UINavigationController内)をプッシュするように指示できる方法を探しています。

これは私がやろうとしたことです (このコードは AppDelegate にあります):

-(void)searchBarSearchButtonClicked:(UISearchBar *)searchBar{
NSLog(@"Searching for: \"%@\"",searchBar.text);
[searchBar resignFirstResponder];
IndexAndSearch *vc = [[IndexAndSearch alloc]initWithNibName:nil bundle:nil];
[self.navigationController pushViewController:vc animated:YES];
}

しかし、それは機能しません (ログに書き込みますが、新しい ViewController をプッシュしません)。また、次のように RootViewController にメッセージを送信しようとしました。

-(void)searchBarSearchButtonClicked:(UISearchBar *)searchBar{
NSLog(@"Searching for: \"%@\"",searchBar.text);
[searchBar resignFirstResponder];
RootViewController *vc = [[RootViewController alloc]initWithNibName:nil bundle:nil];
[vc performSearchFromDelegateSlider];
}

RootViewController の実装ファイルに次のコードを追加します。

-(void)performSearchFromDelegateSlider{
NSLog(@"Searching");
IndexAndSearch *vc = [[IndexAndSearch alloc]initWithNibName:nil bundle:nil];
[self.navigationController pushViewController:vc animated:YES];
}

しかし、もう一度ログに書き込むだけで、viewController をプッシュしませんでした。

Google と SO を広範囲に調べましたが、役に立つものは何も見つかりませんでした。この質問は私のものと似ていますが、適切な回答はありませんでした。答えにはおそらく委任が関係していることはわかっていますが、これに対する解決策について頭を悩ませることはできません。

重要な注意:このスライダーは、アプリ内のほぼすべての ViewController から使用できます。つまり、実装するソリューションが何であれ、すべてのクラスに対して新しい ViewController をプッシュできる必要があります。そのため、このようなソリューションを使用することはできません(各 ViewController に NavigationDelegate コードを入力する必要がありますが、これは私のような大きなアプリでは機能しません)。

助けてくれてありがとう。

4

2 に答える 2

1

それが最善の解決策であるとは確信していませんが、 notificationsを使用してこれを機能させることができました。興味のある人のために、私がやったことは次のとおりです。

ステップ1

最初のステップは、RootViewController の viewDidLoad メソッドで通知を登録することです。

-(void)viewDidLoad{
    [super viewDidLoad];
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(didReceiveNavSliderSearchNotification:) name:@"navSliderSearchNotification" object:nil];
}

ステップ2

次に、スライダーから検索が実行されたときに通知を発生させる必要があります。searchBar コードは私の AppDelegate にあり、次のようになります。

-(void)searchBarSearchButtonClicked:(UISearchBar *)searchBar{
    //Write to the log
    NSLog(@"Searching for: \"%@\"",searchBar.text);
    //Dismiss the keyboard
    [searchBar resignFirstResponder];
    //Post the notification (to be used by the RootViewController
    [[NSNotificationCenter defaultCenter] postNotificationName:@"navSliderSearchNotification" object:self];
}

ステップ 3

次に、didReceiveNavSliderSearchNotificationクラスを作成する必要があります ( navSliderSearchNotification通知が投稿および受信されると、RootViewController で呼び出されます)。

-(void)didReceiveNavSliderSearchNotification:(NSNotification *) notification {

    if ([[notification name] isEqualToString:@"navSliderSearchNotification"])
    NSLog (@"Successfully received the search notification!");    

    //Push the next ViewController when the *navSliderSearchNotification* is received
    IndexAndSearch *vc = [[IndexAndSearch alloc]initWithNibName:@"IndexAndSearch" bundle:nil];
    [self.navigationController pushViewController:vc animated:YES];
}

そして、それが別のクラスから新しいviewControllerをプッシュする方法です(この場合はApp Delegateですが、他のクラスからも機能しています)。

最終ステップ (オプション)

私のスライダーはアプリのどこからでもアクセスできるので、RootViewController の通知から登録を解除しませんでした (つまり、ユーザーが別の viewController にプッシュされた場合でも、これらのメソッドは起動し続けます)。この機能が必要ない場合は、次のコードを使用してこれらの通知から登録を解除してください(これは RootViewController に入ります)。

-(void)viewWillDisappear:(BOOL)animated{
    [[NSNotificationCenter defaultCenter] removeObserver:self name:@"navSliderSearchNotification" object:nil];
}

私が言ったように、私はこれが最善の方法であると完全に確信しているわけではありません. 別の解決策がある場合は、お気軽に投稿してください。

于 2013-02-05T02:58:53.690 に答える
0

これを試しましたか:

画面上の現在の UIViewController を常に参照する UIViewController 変数を AppDelegate に作成します (View Controller を作成するたびに現在のコントローラーを設定する必要がある場合があります)。AppDelegate で使用する

[self.currentViewController.navigationController pushViewController:anotherNewViewController animated:YES];
于 2013-02-04T15:43:03.573 に答える