0


ユーティリティ テンプレート (つまり、メインおよびフリップ ビュー コントローラー) に基づくアプリがあります。フリップ ビューでは、メイン ビューで使用する特定のアイテムを選択できます。これまでのところ - うまくいきます。

カスタム URL を追加してみました。効果のあるもの:myapp://itemID=40これは基本的にメイン ビューに「フリップする必要はありません - アイテム 40 を扱うことになります」と伝えます。

URL タイプ スキームを " myapp" として登録し、アプリ デリゲートに次のメソッドを追加しました。

- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url {
    if (!url) {  
        return NO; 
    }

    NSString *urlString = [url absoluteString];
    NSLog(@"URL received: %@", urlString);
    NSString *itemID = [urlString stringByReplacingOccurrencesOfString:@"myapp://itemID=" withString:@""];
    NSLog(@"Item received: %@", itemID);
    [_mainViewController setStartupItem:itemID]; 
    return YES;
}

ご覧のとおり、itemIDは で呼び出されるプロパティに設定されていstartupItemますmainViewController

次に、通常のapplicationメソッドに1 行追加して、URL がない場合の動作を確認しstartupItemます。nil

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    //Make sure URL string is empty
    [_mainViewController setStartupItem:nil];

    // Override point for customization after application launch.
    // Add the main view controller's view to the window and display.
    self.window.rootViewController = self.mainViewController;
    [self.window makeKeyAndVisible];
    return YES;
}

そして、MainViewController.m で、アイテムをviewDidLoadイベントに処理するコードを追加しました。

そして、ここに私の問題があります。このスキームは、アプリが初めて URL から開始された場合にうまく機能します。すでに実行されている場合は、二度と到達viewDidLoadしないため、その特定のアイテムを処理しませんが、何も渡されなかったかのように続行します。

私の謙虚な質問はUIViewController、処理コードをどちらに入れる必要があるかということです。または、私はこれらすべてに間違った方法でアプローチしていますか? これは私のモデルで処理する必要がありますか?

いつものように、お時間をいただきありがとうございます。

4

2 に答える 2

3

具体的には、UIApplicationDelegate プロトコルのドキュメントを見てみましょう。

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation

そして、これは非推奨です。

- (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url
于 2011-12-06T15:40:25.153 に答える
1

Well definitely not in a method that gets called only once while the application starts up! You need to refactor the item handling code in its own method, then call this method from viewDidLoad (once during startup) and handleOpenURL each time it gets called.

于 2011-04-07T06:49:39.267 に答える