【问题标题】:Calling reload Sections from AppDelegate从 AppDelegate 调用重新加载部分
【发布时间】:2018-03-05 21:22:01
【问题描述】:

我正在构建一个应用程序来跟踪 BLE 设备,并且我有一个委托(在 appDelegate 中)通过蓝牙更新已发现设备的列表。

我需要在 tableview 中显示这些设备,所以当我发现一个设备时,我会在 viewcontroller 中调用一个函数来刷新 tableView。

如果我从 ViewController 调用此函数,它可以工作,但是当我从 AppDelegate 调用它时,它什么也不做,甚至不会出错。

AppDelegate:

//MARK: Discovered Device
func DeviceDiscovered(_ macAddress: String!, withName name: String!, ofType type: Int, andSignalStrength strength: Int) {
        discoveredList["\(entry["time"]!)"] = entry
        ViewController().refresh()
    }
}

视图控制器:

func refresh() {
    self.tableView?.reloadSections(NSIndexSet(index: _sectionIndices.discoveredDevices.hashValue) as IndexSet, with: .none)
}

我在 ViewController 中添加了一个按钮,只需调用 refresh() 即可。或者至少它会重新加载该部分,但在 ViewController 中的 foundList dict 也不会更新,而是一次出现一个问题!

感谢您的帮助!

【问题讨论】:

  • 每次需要刷新时都创建一个新的控制器实例有什么原因吗?
  • 不抱歉,这只是我正在尝试的东西,我使用 self 访问 tableview,但我怀疑问题可能在那里......我在那里编辑了问题......
  • 您应该发布您的视图控制器订阅的Notification,以便知道外围设备列表已更新
  • @Paulw11 他可以那样做,但在我看来“应该”有点强。
  • 可能重复例如stackoverflow.com/questions/41948446/… - 这个错误说 SomeClass() 而没有意识到它没有引用正确的实例是非常常见的,并且在 Stack Overflow 上已经讨论了很多。

标签: ios swift


【解决方案1】:

问题在于ViewController() 不是您的视图控制器。这是一个新的单独实例。您需要引用到您的现有视图控制器。

【讨论】:

  • 你指的是AppDelegate中的调用吗?如何引用现有的?
  • 只有你自己知道。我不知道,因为您还没有透露视图控制器在视图控制器层次结构中的位置。
【解决方案2】:

所以,正如@matt 所指出的,问题在于我在 AppDelegate 中实例化了一个新的 ViewController,所以我这样做了:

let navController       = self.window?.rootViewController as! UINavigationController

newViewController       = navController.visibleViewController as! ViewController

据我了解,从导航控制器中提取对现有 ViewController 的引用。

然后参考

newViewController.refresh()

正确更新 tableView。

我欢迎任何更正以改进这一点,但现在我的代码正在运行!谢谢大家的帮助。

【讨论】:

  • “我欢迎任何更正以改进这一点”不,你所做的正是人们应该做的!
猜你喜欢
  • 2011-06-12
  • 1970-01-01
  • 2013-08-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多