Я пытаюсь интегрировать функцию "Открыть с помощью...".
В моем 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 дает мне правильную длину моего файла. Второй NSLog дает мне правильное «старое» содержимое UITextView, а третий NSLog дает мне правильное «новое» содержимое (начало содержимого файла, который я «открыл с помощью ...» через приложение Dropbox). Таким образом, данные попадают в мое приложение.
Проблема в том, что UITextView не обновляется. Если я нажму любую другую кнопку в UIViewController (что заставит меня переключиться на другой UIViewController), а затем вернусь к «ViewController», UITextView обновится с правильными данными. Даже если я добавлю UIButton и установлю его действие только для вызова [self refreshUI]
обновлений UITextView.
Он просто не обновляется сам по себе из метода, вызываемого из AppDelegate.
Что я делаю неправильно? Я даже пытался вручную перерисовать UITextView с помощью setNeedsDisplay
. Но это не имело никакого эффекта.
Спасибо
stringWithContentsOfURL:encoding:error:
в фоновом потоке, как и должны, но не вызываетеrefreshUI:
в основном потоке.UIKit
любит сбрасывать звонки, сделанные в фоновом потоке. - person NJones   schedule 13.12.2012stringWithContensOfURL
в фоновом потоке, чтобы избежать такой проблемы... это происходит само по себе? ОператорrefreshUI
находится всего через пару строк послеstringWithContensOfURL
, и оба находятся в одном и том же методе. - person Joseph   schedule 13.12.2012NSUserDefaults
, а затем использоватьUIApplicationWillEnterForegroundNotification
для запускаrefreshUI
, который затем просто читает то, что находится вNSUserDefaults
- person Joseph   schedule 13.12.2012refreshUI:
в блоке отправки в основной поток следующим образом:dispatch_async(dispatch_get_main_queue(), ^{[vc refreshUI:nil];});
Если это работает, то, вероятно, это проблема с потоками. - person NJones   schedule 13.12.2012dispatch_async(dispatch_get_main_queue(), ^{[vc refreshUI:nil];});
не изменилось. - person Joseph   schedule 13.12.2012stringWithContentsOfURL
, так иrefreshUI
, UITextView все равно не обновится. - person Joseph   schedule 13.12.2012[_textView setBackgroundColor:[UIColor redColor]];
прямо перед[_textView setText:appDelegate.fileContent];
. UITextView остается белым. Я проверил/перепроверил соединение в IB, и все в порядке. Может ли быть так, что методы вызываются для_textView
еще до того, как он загружен? Тот же оператор в т.е.viewDidAppear
изменяет цвет UITextView, поэтому он правильно подключен. - person Joseph   schedule 13.12.2012refreshUI:
:NSLog(@"address of textfield is %p",self.textView);
. Откройте URL-адрес через свое приложение, а затем нажмите кнопку обновления вручную. Если адрес изменился, вы пишете текст в текстовое поле, которое заменяется. Кроме того, я знаю, что textView подключен правильно, так как кнопка ручного обновления работает. - person NJones   schedule 13.12.2012