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