1

我正在尝试将电子邮件中的文件(csv)打开到我的应用程序中,对其进行解析并将数据(学生)导入课程中。我已经通过 iTunes 和 Dropbox 中的文件成功解析并导入了数据,但在从电子邮件中获取文件时遇到了困难。

具体来说,流程如下所示:打开电子邮件>选择文件以使用我的应用程序打开>应用程序启动并成功将文件读入我的第一个视图控制器......但这是我卡住的地方:

我想弹出一个模式视图,以便用户可以选择他们希望导入的数据(学生)进入的课程。

App Delegate 告诉第一个视图控制器处理 URL:

// from the first view controller
-(void) handleOpenURL:(NSURL *)url
{
    _importedFileURL=url; // if I NSLog this, I can see the file successfully makes it in
     [self performSegueWithIdentifier:@"Select Course for Import" sender:self]; // ***FAIL ***//
}

故事板连接正确,因为如果我使用 NSNotification 我可以让模态视图出现(但随后我失去了 url 的值)。似乎该视图没有机会出现,因此无法处理转场。

关于如何让模态视图出现并保留 _importedFileURL 的任何建议?

4

1 回答 1

0

已解决:怀疑使用 NSNotification Center:D

在我的 AppDelegate(.m) 中,我在 openURL 中添加了以下例程

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{
  ... other code to handle Dropbox imported URLs

  // Check to see if a file has been sent over via another app, like e-mail
  if (url != nil && [url isFileURL])
      {
        MainViewController  *firstViewController = [[MainViewController alloc]init];
        [firstViewController handleOpenURL:url];
        NSURL *fileFromEmail=url;
        // add the url as a dictionary item, so that I can open it with NSNotificationCenter
        NSDictionary *fileInfo=[NSDictionary dictionaryWithObject:fileFromEmail forKey:@"fileFromEmail"];
        // add a notification named "segueListener" and pass on the dictionary object
        [[NSNotificationCenter defaultCenter] postNotificationName:@"segueListener" object:nil userInfo:fileInfo];

        return YES;
    }
}

然后在 viewDidLoad 的 MainViewController(.m) 中,我添加了一个 NSNotification Observer:

- (void)viewDidLoad
{    
    [super viewDidLoad];
    ... 
    // if a notification named "segueListener" is sent out, perform the method: segueToImportFile
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(segueToImportFile:) name:@"segueListener" object:nil];
}

然后添加了 handleOpenURL 方法:

-(void) handleOpenURL:(NSURL *)url
{
   // capture the url and store it into _importedFileURL (NSURL)
    _importedFileURL=url;
}

和 segueToImportFile 方法:

-(void)segueToImportFile:(NSNotification *)notification
{
    NSDictionary *file=[notification userInfo]; // get the dictionary object userInfo
    _importedFileURL=[file objectForKey:@"fileFromEmail"]; 
    [self performSegueWithIdentifier:@"Select Course for Import" sender:self];
}

最后,segue 会将 _importedFileURL 发送到列出课程的新 TableViewController:

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    UINavigationController *navigationController=segue.destinationViewController;
    SelectCourseTableViewController *selectCourseTableViewController=[[navigationController viewControllers]objectAtIndex:0];
    selectCourseTableViewController.segueFrom=@"Email Import"; // from the storyboard
    selectCourseTableViewController.importedFile = _importedFileURL;
}
于 2013-05-12T02:03:14.863 回答