大佬教程收集整理的这篇文章主要介绍了iOS – Objective-C – 小部件文本和图像加倍 – 旧数据不会被清除,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
在小部件中,我从Web下载(在后台线程中)新数据并将它们(在dispatch_get_main_queue()中)放入标签,图像等中.一切正常,但有时旧数据不会被“清除”.在我的小部件设计文件中,我已经清除了所有“默认”文本,所以这不是这个问题.
加倍图标&文本4.1°C和7.9°C是重叠的
我的小部件代码的主要部分是(通过删除其他标签,表格和地理位置缩短):
- (void)viewDidLoad { [super viewDidLoad]; if ([self.extensionContext respondsToSelector:@selector(widgetLargestAvailableDisplayMode)]) { //this is iOS >= 10 self.extensionContext.widgetLargestAvailableDisplayMode = NCWidgetDisplayModeExpanded; } [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(FinishDownload:) name:@"FinishDownload" object:nil]; self.preferredContentSize = CGSizeMake(320,160); [self updateData]; } -(void)viewDidAppear:(BOOL)animated { [super viewDidAppear:animated]; [self updateData]; } -(void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; [self updateData]; } -(void)updateData { [[[DataManager SharedManager] settings] Reload]; [[CoreDataManager SharedManager] reset]; if ([[DataManager SharedManager] DownloadDataWithAfterSelector:@"FinishDownload"] == NO) { //no need to download update - refill data Now //if downloading - wait for download [self FillData]; } } } -(void)FinishDownload:(NSNotification *)notification { dispatch_async(dispatch_get_main_queue(),^{ [self FillData]; }); } -(void)FillData { //a lot of code - example of setting temperature NSString *str = [NSString stringWithFormat:@"%@ °C",act.temp_act]; self.lblTemp.text = str; [self.lblTemp sizeToFit]; if (self.completionHandler != nil) { self.completionHandler(NCUpdateResultNewData); } } - (void)widgetPerformUpdateWithCompletionHandler:(void (^)(NCUpdateResult))completionHandler { // Perform any setup necessary in order to update the view. // If an error is encountered,use NCUpdateResultFailed // If there's no update required,use NCUpdateResultNoData // If there's an update,use NCUpdateResultNewData //completionHandler(NCUpdateResultNewData); NSLog(@"=== widgetPerformUpdateWithCompletionHandler === "); self.completionHandler = completionHandler; [self updateData]; } - (UIEdgeInsets)widgetMarginInsetsForProposedMarginInsets:(UIEdgeInsets)defaultMarginInsets { return UIEdgeInsetsMake(0,5,5); } - (void)widgetActiveDisplayModeDidChange:(NCWidgetDisplayMode)activeDisplayMode withMaximumSize:(CGSize)maxSize { if (activeDisplayMode == NCWidgetDisplayModeExpanded) { self.preferredContentSize = CGSizeMake(320,160); } else if (activeDisplayMode == NCWidgetDisplayModeCompact) { self.preferredContentSize = maxSize; } }
不要在viewDidLoad和viewWillAppear / viewDidAppear中复制工作.
已加载的视图将触及所有三种方法.使用viewDidLoad进行必须在UIViewController的生命周期内执行一次的操作.
潜在问题:
可能使用竞争的NCUpdateResult完成处理程序3,将[self updateData]的3个调用(可能会发生冲突)重新触发.
>平衡观察员
似乎addObserver永远不会被removeObserver平衡.这些注册方法的一个好位置是一组平衡消息,例如view___Appear和view___Disappear方法,如StackOverflow answer中所述.
潜在问题:
持久注册可能超出范围的对象的通知.
>不要缓存OS处理程序
可能滥用NCUpdateResultNewData完成处理程序:将NCUpdateResult传递给widgetPerformUpdateWithCompletionHandler以用于该特定调用,而不是存储以供多次重用.它可能应该传递给updateData作为参数而不是存储在全局中,然后传递给FillData,并最终在一次性使用后被清除.
if (nil != self.completionHandler) { self.completionHandler(NCUpdateResultNewData); self.completionHandler = nil; // One time use }
每个对widgetPerformUpdateWithCompletionHandler的调用都有自己的循环,如this StackOverflow answer所述.
>布局&自动布局
请注意,iOS正在制作小部件的快照;在Interface Builder中,确保使用适当的视图分层.特别注意透明度和绘制标志.利用Autolayout调整对象的大小/大小/捕捉
以上是大佬教程为你收集整理的iOS – Objective-C – 小部件文本和图像加倍 – 旧数据不会被清除全部内容,希望文章能够帮你解决iOS – Objective-C – 小部件文本和图像加倍 – 旧数据不会被清除所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。