【问题标题】:Keep a storyboard's UITableViewController running while it's not visible保持故事板的 UITableViewController 在不可见时运行
【发布时间】:2014-06-19 03:52:25
【问题描述】:

我最近进入了 iOS 开发领域。我编写了我的第一个应用程序,它应该会在您使用地理围栏进入某个位置时提醒您。

我的应用由一个故事板组成,具有三个视图:

  • ToDoListTableViewController
  • AddToDoItemViewController
  • 地理围栏表视图控制器

GeofenceTableViewController.m 文件包含创建、编辑和删除地理围栏的代码。它还具有在进入或退出地理围栏时生成通知的代码。这个没问题,我已经测试了好几次了。

问题来了: 每当我在 iOS 模拟器中时,只要我正在查看 GeofenceTableViewController 视图,该应用程序就会按预期生成通知并写入调试日志,但是如果我正在查看其他两个视图中的任何一个并且我更改了模拟器的位置,应用上没有任何反应。

所以我想知道的是,即使该类在 iOS 模拟器屏幕上不可见,如何保持 GeofenceTableViewController 方法运行。

这是一个视频,展示了当我在特定视图上时,我更改 xcode 的位置时,应用程序如何创建通知(延迟 3 秒),以及当我在另一个视图上时(当我按下“产品”按钮),并更改 xcode 的位置,应用程序不会创建通知,除非我重新进入“位置”视图(当我按下底部的 + 符号时)。

https://www.youtube.com/watch?v=5taaO8UAiLc

我缺少一些非常普遍的东西吗?或者你们需要看代码来帮助我吗?

请告诉我。

非常感谢!

【问题讨论】:

  • @rdelmar 我将 + 符号按钮控制拖动到 GeofenceTableViewController,然后选择了 PUSH。我猜这叫Push Segue?这样做会在 GeofenceTableViewController 中自动创建一个“返回”按钮,这是我用来返回的。

标签: ios objective-c uitableview


【解决方案1】:

您只需要阻止该控制器(地理围栏)被释放。你如何做到这一点取决于你的控制器层次结构,但是一些对象需要保持一个指向它的强指针。如果它是从 AddToDoItemViewController 推送或呈现的,那么该控制器应该有一个指向它的属性,并且仅在它第一次推送或呈现它时实例化控制器:您必须手动呈现或推送,而不是这样做有一个 segue,因为他们总是实例化新的控制器。当然,如果你是这样做的,你必须确保 AddToDoItemViewController 也不会被释放。

这样就完成了,

-(IBAction)pushToGeofence:(id)sender {
    if (! self.gvc) { // gvc is a property, @property (strong,nonatomic) GeofenceViewController *gvc
       self.gvc = [self.storyboard instantiateViewControllerWithIdentifier:@"Geofence"];
    }
    [self.navigationController pushViewController:self.gvc animated:YES];
}

【讨论】:

  • 我将 + 符号按钮控制拖动到 GeofenceTableViewController,然后选择了 PUSH。我猜这叫Push Segue?这样做会在 GeofenceTableViewController 中自动创建一个“返回”按钮,这是我用来返回的。编辑:非常感谢,我会搜索如何防止控制器被释放。
  • 这是我应该做的吗?我想在尝试之前确定该帖子是否对我有帮助,因为我是 iOS 开发的新手。再次感谢! stackoverflow.com/questions/9151785/…
  • @FranciscoJavierHerrera,您在该链接中实例化控制器的方式是正确的,但它需要在 if 语句中检查属性是否为 nil(它会在您第一次这样做之前推)。因此,您检查属性是否为零,如果是,则进行实例化,然后进行推送。如果它不是 nil,就执行 push。
  • @FranciscoJavierHerrera,我已经用示例代码更新了我的答案。
  • 我已经实现了代码,如示例所示: -(IBAction)pushToGeofence:(id)sender { if (!self.gvc) { HelloWorldGeofenceViewController *gvc = [self.storyboard instantiateViewControllerWithIdentifier :@"地理围栏"]; } [self.navigationController pushViewController:self.gvc 动画:YES]; } 我还添加了属性(我在 HelloWorldGeofenceViewController.m 文件中完成了所有这些操作),在我的 main.storyboard 上,我从 + 按钮中删除了 segue,并向其中添加了 pushToGeofence 方法。跨度>
猜你喜欢
  • 1970-01-01
  • 2013-07-05
  • 2016-11-30
  • 2019-01-16
  • 1970-01-01
  • 2014-11-30
  • 2012-02-11
  • 1970-01-01
  • 2013-03-17
相关资源
最近更新 更多