3

iOS で Azure Mobile Service を使用しており、認証を有効にしています。tabBarController を使用する例として Microsoft が提供する既定のアプリを拡張しました。1 つのコントローラーは、MS が使用する既定であり、ToDoListController と呼ばれます。

AddItemController である 2 番目のコントローラーで ToDoListController で使用される todoService プロパティを使用したいと考えています。だから、ToDoListControllerのヘッダーに私は持っています

@property (strong, nonatomic) TodoService *todoService;

そして、同じコントローラーのmで、私はそれを合成しています。

このプロパティを tabBarController で使用する場合は、次のように参照します。

(((TodoListController *)self.parentViewController).todoService)

しかし、私は得る

[UITabBarController todoService]: 認識できないセレクターがインスタンスに送信されました

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[UITabBarController todoService]: unrecognized selector sent to instance 
4

5 に答える 5

4

タブバー コントローラの 1 つにアクセスしようとしているようです。これを試して

for (UIViewController *v in ((UITabBarController*)self.parentviewController).viewControllers)
{
     UIViewController *vc = v;

     if ([v isKindOfClass:[TodoListController class])
     {
         ((TodoListController *)v).todoservice;
     }
}
于 2013-02-19T20:30:59.613 に答える
0

最後に、問題はブレークポイントでした。データは問題なく通過するようになりました

(((TodoListController *)self.parentViewController).todoService)
于 2013-02-20T09:39:34.913 に答える
0

ToDoService の .h ファイルを tabBarController にインポートしましたか? これにより、tabBarController への可視性が許可されます。コメント機能を使用していないことをあらかじめお詫び申し上げます。許可されていません。

于 2013-02-19T20:19:38.757 に答える
0

間違ったコントローラーにセレクターを送信している場合は、階層内のどのコントローラーが自分の TodoListController のものかを検出してみてください。なぜparentViewControllerがTodoListControllerだと思いますか?

UITabBarController 内で現在の VC をモーダルとして提示している場合、parentVC は UITabBarController です。

また、試すことができself.parentViewController.parentViewControllerます。

于 2013-02-19T20:45:04.753 に答える
0

TodoService をシングルトンにすることをお勧めします。これを行うには多くの方法があります。ここに、どこからでもアクセスできるシングルトンを作成する簡単なコードを示します*。このメソッド シグネチャを TodoService.h ファイルに追加します。

+ (TodoService *) defaultService;

そして今回の実装

TodoService *todoService;

+ (TodoService *)defaultService
{
    if (todoService == nil) {
        todoService = [[TodoService alloc] init];
    }
    return todoService;
}

アプリケーションのどこからでも、次の方法で単一のインスタンスにアクセスできます。

TodoService* service = [TodoService defaultService];
[service doSomething];

*注意: Objective C でシングルトンを実装するより良い方法がありますが、これは、メイン スレッドでのみ defaultService を呼び出すほとんどの場合に適した方法です。

于 2013-02-19T23:05:56.960 に答える