您实际上从项目成就中学到了什么? (1/2)

通常,应用程序开发人员在不同的项目上工作,并说这与之前的项目是同一项目,我没有做任何新的事情 。 但这不仅仅涉及放置UIViewControllerUITableView 。 总会有一个小的新功能或新类型的错误修复程序,可以提高您的技能和信心。 因此,在这个故事中,我将分享我对最近项目成就的学习。 我知道写东西并不重要,但这使我可以与大家分享。

Bug修复

1. UITableView在reloadData()上波动

😖😖😖😖

当您具有不同类型的具有动态高度的像元时,就是这种情况。 因此,通常我们会执行以下操作:命中HTTP请求,生成单元模型并重新加载Data()。 现在您已经观察到在某些情况下,即使您添加行高委托,它也会在重新加载时波动。

  func tableView(_ tableView:UITableView, 
heightForRowAt indexPath:IndexPath)-> CGFloat {
返回UITableViewAutomaticDimension
}
  func tableView(_ tableView:UITableView, 
EstimatedHeightForRowAt indexPath:IndexPath)-> CGFloat {
回报44.0
}

那怎么了

波动的实际原因是估计大小又称为44.0的硬编码值。 您的单元格至少需要最小高度150.0,估计为44.0,它将在重新加载时尝试在运行时获取空间,这会引起波动。 因此,不要放置硬编码的值,而使用引用的值

  tableView.bounds.height / 2 

该值将为单元提供足够的保留高度,以根据需要进行扩展和调整。 因此,波动f *** g消失了:)。

2.带有静态单元格波动的UITableViewController成为第一响应者。

在最近的iOS≥11版本中,我已经多次遇到此问题。 实际发生的情况是,当您添加静态单元格并放置一些UITextFieldUITextView时 然后点击文本字段,出现键盘,表格上升和下降。 因此,我必须删除UITableViewController并像以前一样手动将UIViewControllerUITableView添加。 我懒得做重复的任务。 所以这一次我做了修复/解决该问题。 我把任务分为两部分

答:停止自动偏移更改
我从堆栈溢出中得到了一个答案,如果我们重写viewWillAppear且不调用它的super方法 ,它将停止更改tableView的内容偏移量。

 覆盖viewWillAppear(_动画:布尔){ 
//不要调用超级方法
}

B:设置自定义偏移量,以使文本字段可见
现在,解决了一个问题,我也需要默认行为。 为此,我添加了两个通知-UIKeyboardWillShowUIKeyboardWillHide-并添加了所有输入字段和contentOffset的数组以存储值。

因此,现在,无论何时键盘即将出现,它的通知处理程序都会保存当前偏移量,并检查firstResponder视图。 根据Superview中的位置,更新tableView的偏移量。 然后,当键盘即将消失时,重置偏移量。 因此,没有波动,我就能达到要求。

3.后台模式下的APNS重定向

我有一个常见的场景是在用户点击通知时打开视图。
但是通常我们要做的是请求通知并放置代表

 扩展名AppDelegate:UNUserNotificationCenterDelegate { 
  func registerForPushNotifications(){ 
让中心= UNUserNotificationCenter.current()
center.requestAuthorization(
选项:[.badge,.alert,.sound]
){(flag,error)in
如果标志{
DispatchQueue.main.async {
UIApplication.shared.registerForRemoteNotifications()
}
}
}
}
  func userNotificationCenter(_中心:UNUserNotificationCenter, 
willPresent通知:UNNotification,
withCompletionHandlercompleteHandler:
@转义(UNNotificationPresentationOptions)->无效){

让userInfo = notification.request.content.userInfo
print(“ APNS willPresent:\(userInfo)”)
completeHandler([。badge,.alert,.sound])
}
  func userNotificationCenter(_中心:UNUserNotificationCenter, 
didReceive响应:UNNotificationResponse,
withCompletionHandler completeHandler:@escaping()-> Void){
 让userInfo = response.notification.request.content.userInfo 
print(“ APNS didReceive:\(userInfo)”)
completeHandler()
}
  } 

该代码似乎很好,但是没有在两个委托之上调用。 我花了很多时间来找到解决方案。 许多堆栈溢出的答案都告诉我,它们使用的是iOS <10中使用的旧通知方法。我也尝试过这样做,但不能满足处理单独用户点击或仅在家打开应用程序的要求。

实际的解决方案是

  center.delegate =自我 

尽管我符合委托但未设置self ,这就是为什么通知到达时为什么调用了旧方法的原因。 有了这个解决方案,它现在就像一个魅力。

目前为止就这样了。

花费了一些额外的时间,经历了一些尝试和错误,并且不害怕提出问题,这使我学习了一些新知识,并提高了自己的方法和效率。 我鼓励您也这样做。

在下一个博客中,我很乐意分享我自己开发的一些东西。

敬请期待😃😃😃!

更新资料

专题博客在这里…