【问题标题】:IBOutlets are all nil when back from background从后台返回时,IBOutlets 全部为零
【发布时间】:2014-01-28 15:54:40
【问题描述】:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // Override point for customization after application launch.
    NSString *storyName;
    if (isIPAD)
        storyName = @"Main_iPad";
    else
        storyName = @"Main";

    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:storyName bundle:nil];
    RMViewController *controller = (RMViewController *)[storyboard instantiateInitialViewController];

    NSURL *url = (NSURL *)[launchOptions valueForKey:UIApplicationLaunchOptionsURLKey];
    if (url != nil && [url isFileURL]) {
        [controller handleOpenURL:url];
    }

    return YES;
}
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{
    NSString *storyName;
    if (isIPAD)
        storyName = @"Main_iPad";
    else
        storyName = @"Main";

    UIStoryboard *storyboard = [UIStoryboard storyboardWithName:storyName bundle:nil];
    RMViewController *controller = (RMViewController *)[storyboard instantiateInitialViewController];
    if (url != nil && [url isFileURL]) {
        [controller handleOpenURL:url];
    }
    return YES;
}

这就是我的 AppDelegate 中的内容。这有助于我用此处所述的新数据覆盖旧 iPhone 数据:http://www.raywenderlich.com/1980/email-tutorial-for-ios-how-to-import-and-export-app-data-via-email-in-your-ios-app#comments

现在,当我调用函数 handleOpenURL 时,数据保存得很好,但是当我尝试根据新数据设置我的 IBOutlets 时,我的所有出口实际上都是 nil(使用断点测试)。

我很困惑,因为我得到的新数据实际上是正确的,但是当我尝试将其分配给 IBOutlet(文本字段或标签)时,它没有响应。

我认为这与进入后台有关,因为如果我杀死应用程序并稍后启动它,应用程序就会加载新数据。

有什么帮助吗??

【问题讨论】:

  • 会不会是我在appdelegate中手动实例化后又实例化了ViewController丢了storyboard?

标签: ios objective-c background null iboutlet


【解决方案1】:

这个:

RMViewController *controller = (RMViewController *)[storyboard instantiateInitialViewController];

创建一个完全不与应用 UI 关联的全新视图控制器。它执行的基于数据的操作可能运行良好,但它无法更改应用 UI。

您可能应该做的是在现有 UI 设置中找到现有的 RMViewController 实例,可能通过应用程序 window 及其到根视图控制器的链接。

失败了,尽管这可能是正确的解决方案,但至少呈现 RMViewController 实例以便加载其视图。同样,演示文稿将来自根视图控制器。


来自您的评论:

RMViewController *controller = (RMViewController *)self.window.rootViewController;

【讨论】:

  • 是的,就像我想的那样(刚刚写了我的评论)。 RMViewController 是根视图控制器,我怎样才能达到那个抛出的 appdelegate (这么旧的一个在进入后台之前已经被初始化的)?谢谢。
  • 刚刚发现你已经写过的窗口 rootViewController 属性。非常感谢!!
猜你喜欢
  • 2011-04-29
  • 1970-01-01
  • 1970-01-01
  • 2014-11-14
  • 2016-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多