1

我正在尝试集成“打开方式...”功能。

在我的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,所以我只在 my 中调用以下内容,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 为我提供了正确的文件长度。第二个 NSLog 为我提供了 UITextView 的正确“旧”内容,第三个 NSLog 为我提供了正确的“新”内容(从我通过 Dropbox 应用程序“打开...”的文件的内容开始)。所以数据确实进入了我的应用程序。

问题是 UITextView 没有得到更新。如果我按下 UIViewController 中的任何其他按钮(这会导致我切换到不同的 UIViewController),然后返回“ViewController”,则 UITextView 会使用正确的数据进行更新。即使我添加一个 UIButton 并将其操作设置为仅调用[self refreshUI]UITextView 更新。

它只是不会从 AppDelegate 调用的方法中自行刷新。

我究竟做错了什么?我什至尝试手动重绘 UITextView setNeedsDisplay。但这没有任何效果。

谢谢

4

2 回答 2

1

现在可以从您的评论中推断出来。似乎您的故事板 segues 正在实例化您的“ViewController”类的新实例,而不是让您回到原来的状态。然而,原来的仍然是应用程序委托的rootViewController. 这会导致您向视图控制器的一个实例发送消息,该实例不是当前呈现的。本质上,您正在更改您看不到的标签。有几种方法可以解决这个问题。

  • 改变你的segues,让他们带你回到rootViewController

这可能是最简单的,并且可能会提高您的效率。在导致返回的方法中,使用带有pop...or之类的词的方法dismiss

  • 使用委托:

将 a 添加urlLaunchDelegate到您的应用程序委托中,并在适当的时间(viewDidLoadviewWillAppear:)让您的视图控制器将自己设置为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 回答