You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@weex.apache.org by cx...@apache.org on 2018/06/14 06:56:35 UTC
incubator-weex git commit: [WEEX-459][iOS] Fix crash if template not
registered for recycle list on iOS.
Repository: incubator-weex
Updated Branches:
refs/heads/master d1d80057b -> ece3827d5
[WEEX-459][iOS] Fix crash if template not registered for recycle list on iOS.
Project: http://git-wip-us.apache.org/repos/asf/incubator-weex/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-weex/commit/ece3827d
Tree: http://git-wip-us.apache.org/repos/asf/incubator-weex/tree/ece3827d
Diff: http://git-wip-us.apache.org/repos/asf/incubator-weex/diff/ece3827d
Branch: refs/heads/master
Commit: ece3827d5fd56f7cd7333dc744425df45e07edd9
Parents: d1d8005
Author: 神漠 <qi...@alipay.com>
Authored: Wed Jun 13 20:08:12 2018 +0800
Committer: Adam Feng <cx...@gmail.com>
Committed: Thu Jun 14 14:56:26 2018 +0800
----------------------------------------------------------------------
.../Component/RecycleList/WXRecycleListComponent.mm | 16 +++++++++++-----
.../RecycleList/WXRecycleListTemplateManager.h | 4 ++++
.../RecycleList/WXRecycleListTemplateManager.m | 16 +++++++++++++++-
3 files changed, 30 insertions(+), 6 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/ece3827d/ios/sdk/WeexSDK/Sources/Component/RecycleList/WXRecycleListComponent.mm
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK/Sources/Component/RecycleList/WXRecycleListComponent.mm b/ios/sdk/WeexSDK/Sources/Component/RecycleList/WXRecycleListComponent.mm
index 551acd9..a55dada 100644
--- a/ios/sdk/WeexSDK/Sources/Component/RecycleList/WXRecycleListComponent.mm
+++ b/ios/sdk/WeexSDK/Sources/Component/RecycleList/WXRecycleListComponent.mm
@@ -499,12 +499,18 @@ WX_EXPORT_METHOD(@selector(setListData:))
// 1. get the data relating to the cell
id data = [_dataManager dataAtIndex:indexPath.row];
- // 2. get the template type specified by data
+ // 2. get the template type specified by data, and if template is not found, return an empty view of any template to avoid crash.
NSString * templateType = [self templateType:indexPath];
_templateManager.collectionView = collectionView;
- if (!templateType) {
- WXLogError(@"Each data should have a value for %@ to indicate template type", _templateSwitchKey);
- return nil;
+ if (!templateType || (templateType && ![_templateManager isTemplateRegistered:templateType])) {
+ WXLogError(@"Template %@ not registered for collection view.", templateType);
+ UICollectionViewCell *cellView = [_collectionView dequeueReusableCellWithReuseIdentifier:[_templateManager anyRegisteredTemplate] forIndexPath:indexPath];
+ for (UIView *view in cellView.contentView.subviews) {
+ [view removeFromSuperview];
+ }
+ cellView.wx_component = nil;
+ [cellView setAccessibilityIdentifier:nil];
+ return cellView;
}
// 3. dequeue a cell component by template type
@@ -607,7 +613,7 @@ WX_EXPORT_METHOD(@selector(setListData:))
return templateType;
}
- if (_templateSwitchKey &&data[_templateSwitchKey]){
+ if (_templateSwitchKey && data[_templateSwitchKey]){
templateType = data[_templateSwitchKey];
} else if (data[WXDefaultRecycleTemplateType]){
// read the default type.
http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/ece3827d/ios/sdk/WeexSDK/Sources/Component/RecycleList/WXRecycleListTemplateManager.h
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK/Sources/Component/RecycleList/WXRecycleListTemplateManager.h b/ios/sdk/WeexSDK/Sources/Component/RecycleList/WXRecycleListTemplateManager.h
index 926c2f1..b956122 100644
--- a/ios/sdk/WeexSDK/Sources/Component/RecycleList/WXRecycleListTemplateManager.h
+++ b/ios/sdk/WeexSDK/Sources/Component/RecycleList/WXRecycleListTemplateManager.h
@@ -32,4 +32,8 @@
- (WXCellSlotComponent *)topTemplate;
+- (BOOL)isTemplateRegistered:(NSString *)aTemplate;
+
+- (NSString *)anyRegisteredTemplate;
+
@end
http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/ece3827d/ios/sdk/WeexSDK/Sources/Component/RecycleList/WXRecycleListTemplateManager.m
----------------------------------------------------------------------
diff --git a/ios/sdk/WeexSDK/Sources/Component/RecycleList/WXRecycleListTemplateManager.m b/ios/sdk/WeexSDK/Sources/Component/RecycleList/WXRecycleListTemplateManager.m
index 199d551..2a90eeb 100644
--- a/ios/sdk/WeexSDK/Sources/Component/RecycleList/WXRecycleListTemplateManager.m
+++ b/ios/sdk/WeexSDK/Sources/Component/RecycleList/WXRecycleListTemplateManager.m
@@ -31,12 +31,14 @@
@implementation WXRecycleListTemplateManager
{
+ NSMutableSet<NSString *> *_registeredTemplates;
NSMapTable<NSString *, WXCellSlotComponent *> *_templateTypeMap;
}
- (instancetype)init
{
if (self = [super init]) {
+ _registeredTemplates = [NSMutableSet set];
_templateTypeMap = [NSMapTable strongToWeakObjectsMapTable];
}
@@ -87,7 +89,7 @@
- (void)_registerCellClassForReuseID:(NSString *)templateID
{
WXLogDebug(@"register cell class for template id:%@", templateID);
- //TODO: register class update TemplateId
+ [_registeredTemplates addObject:templateID];
[_collectionView registerClass:[WXReusableCollectionViewCell class] forCellWithReuseIdentifier:templateID];
}
@@ -103,4 +105,16 @@
return cellTemplate;
}
+- (BOOL)isTemplateRegistered:(NSString *)aTemplate
+{
+ WXAssertMainThread();
+ return [_registeredTemplates containsObject:aTemplate];
+}
+
+- (NSString *)anyRegisteredTemplate
+{
+ WXAssertMainThread();
+ return [_registeredTemplates anyObject];
+}
+
@end