iOS   发布时间:2022-03-30  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了iOS – Objective-C – 小部件文本和图像加倍 – 旧数据不会被清除大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
在iOS应用程序小部件中,我只能在某些设备上看到双倍的数据(见下图).我试图识别设备,iOS版本,但它似乎是“随机的”.另外,我自己无法对此进行调试,因为在我的每个设备上,所有设备都正确呈现并且盲目调试无法正常工作(AppStore上的多次更新但仍然存在相同的错误).

在小部件中,我从Web下载(在后台线程中)新数据并将它们(在dispatch_get_main_queue()中)放入标签,图像等中.一切正常,但有时旧数据不会被“清除”.在我的小部件设计文件中,我已经清除了所有“认”文本,所以这不是这个问题.

iOS – Objective-C – 小部件文本和图像加倍 – 旧数据不会被清除

加倍图标&文本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,请注明来意。
标签: