1

「Openwith...」機能を統合しようとしています。

私のAppDelegate.m中に

-(BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{
...
_fileContent = [NSString stringWithContentsOfURL:url
                                                encoding:NSUTF8StringEncoding
                                                   error:&error];
...
ViewController *vc = (ViewController*)self.window.rootViewController;
        [vc refreshUI:nil];
}

私はARCを使用しているので、次のように呼び出すだけで、ViewController.h後で省略@synthesizeします。.m

@property (nonatomic, retain) IBOutlet UITextView *textView;

私のViewController.m中には次のものがあります

-(void)refreshUI:(id)sender
{
    AppDelegate *appDelegate = (AppDelegate*)[[UIApplication sharedApplication] delegate];

    if ([appDelegate openedFromURL])
    {
        NSLog(@"[refreshUI] appDelegate openFromURL (Length: %d)", [appDelegate.fileContent length]);
        NSLog(@"Contents before: %@", [_textView text]);
        [_textView setText:appDelegate.fileContent];
        NSLog(@"Contents after: %@", [_textView text]);
    }
...
}

別のアプリケーション(Dropbox)からファイルを開くと、最初のNSLogでファイルの正しい長さがわかります。2番目のNSLogはUITextViewの正しい「古い」コンテンツを提供し、3番目のNSLogは正しい「新しい」コンテンツを提供します(ドロップボックスアプリを介して「開いた...」ファイルのコンテンツを開始します)。したがって、データは私のアプリに届きます。

問題は、UITextViewが更新されないことです。UIViewControllerの他のボタンを押して(別のUIViewControllerに切り替えます)、「ViewController」に戻ると、UITextViewが正しいデータで更新されます。UIButtonをに追加し[self refreshUI]、UITextViewの更新のみを呼び出すようにアクションを設定した場合でも。

AppDelegateから呼び出されているメソッドからそれ自体が更新されることはありません。

私は何が間違っているのですか?を使用してUITextViewを手動で再描画してみましたsetNeedsDisplay。しかし、それは効果がありませんでした。

ありがとう

4

2 に答える 2

1

あなたのコメントから推測できるように。ストーリーボードのセグエは、元のインスタンスに戻すのではなく、「ViewController」クラスの新しいインスタンスをインスタンス化しているようです。ただし、元のファイルは引き続きアプリデリゲートrootViewControllerです。これにより、現在表示されているものではないViewControllerのインスタンスにメッセージを送信することになります。基本的に、表示されないラベルを変更しています。これを修正する方法はいくつかあります。

  • セグエを変更して、次の場所に戻しますrootViewController

これはおそらく最も簡単で、効率が向上する可能性があります。pop...戻り値を生成するメソッドでは、またはのような単語を含むメソッドを使用しますdismiss

  • 委任を使用する:

urlLaunchDelegateアプリデリゲートにを追加し、適切なタイミング(viewDidLoadまたはviewWillAppear:)でViewController自体をとして設定しますurlLaunchDelegate

  • 使用NSNotificationCenter

MyApplication_LaunchURLNotificationビューコントローラが監視するような通知を受け取ります。オブジェクトとしてを追加できNSURLます。

于 2012-12-13T19:50:03.553 に答える
0
@property (nonatomic, retain) IBOutlet UITextView

名前を宣言する必要があります

@property (nonatomic, retain) IBOutlet UITextView *textView

また、IBOutletのtextViewもリンクする必要があります。

于 2012-12-13T16:22:08.677 に答える