Feature/fix npe exception (#566)
* android: add exception catch for list flowlayout scroller type * iOS: add exception catch for list flowlayout scroller type
This commit is contained in:
@@ -399,11 +399,11 @@ - (void)blendSubNode:(NSDictionary *)subModel {
|
||||
NSString *viewId = subModel[@"id"];
|
||||
DoricViewNode *viewNode = [self subNodeWithViewId:viewId];
|
||||
BOOL skipReload = NO;
|
||||
|
||||
|
||||
NSMutableDictionary *model = [[self subModelOf:viewId] mutableCopy];
|
||||
[self recursiveMixin:subModel to:model];
|
||||
[self setSubModel:model in:viewId];
|
||||
|
||||
|
||||
if (viewNode) {
|
||||
CGSize originSize = viewNode.view.frame.size;
|
||||
[viewNode blend:subModel[@"props"]];
|
||||
@@ -413,7 +413,7 @@ - (void)blendSubNode:(NSDictionary *)subModel {
|
||||
skipReload = YES;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (skipReload) {
|
||||
return;
|
||||
}
|
||||
@@ -459,41 +459,46 @@ - (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSe
|
||||
}
|
||||
|
||||
- (__kindof UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
|
||||
NSUInteger position = (NSUInteger) indexPath.row;
|
||||
NSDictionary *model = [self itemModelAt:position];
|
||||
NSDictionary *props = model[@"props"];
|
||||
NSString *identifier = props[@"identifier"] ?: @"doricCell";
|
||||
if (self.loadMore
|
||||
&& position >= self.itemCount
|
||||
&& self.onLoadMoreFuncId) {
|
||||
identifier = @"doricLoadMoreCell";
|
||||
[self callLoadMore];
|
||||
}
|
||||
[collectionView registerClass:[DoricFlowLayoutViewCell class] forCellWithReuseIdentifier:identifier];
|
||||
DoricFlowLayoutViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:identifier forIndexPath:indexPath];
|
||||
if (!cell.viewNode) {
|
||||
DoricFlowLayoutItemNode *itemNode = (DoricFlowLayoutItemNode *) [DoricViewNode create:self.doricContext withType:@"FlowLayoutItem"];
|
||||
[itemNode initWithSuperNode:self];
|
||||
cell.viewNode = itemNode;
|
||||
[cell.contentView addSubview:itemNode.view];
|
||||
} else {
|
||||
[cell.viewNode reset];
|
||||
}
|
||||
@try {
|
||||
NSUInteger position = (NSUInteger) indexPath.row;
|
||||
NSDictionary *model = [self itemModelAt:position];
|
||||
NSDictionary *props = model[@"props"];
|
||||
NSString *identifier = props[@"identifier"] ?: @"doricCell";
|
||||
if (self.loadMore
|
||||
&& position >= self.itemCount
|
||||
&& self.onLoadMoreFuncId) {
|
||||
identifier = @"doricLoadMoreCell";
|
||||
[self callLoadMore];
|
||||
}
|
||||
[collectionView registerClass:[DoricFlowLayoutViewCell class] forCellWithReuseIdentifier:identifier];
|
||||
DoricFlowLayoutViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:identifier forIndexPath:indexPath];
|
||||
if (!cell.viewNode) {
|
||||
DoricFlowLayoutItemNode *itemNode = (DoricFlowLayoutItemNode *) [DoricViewNode create:self.doricContext withType:@"FlowLayoutItem"];
|
||||
[itemNode initWithSuperNode:self];
|
||||
cell.viewNode = itemNode;
|
||||
[cell.contentView addSubview:itemNode.view];
|
||||
} else {
|
||||
[cell.viewNode reset];
|
||||
}
|
||||
|
||||
DoricFlowLayoutItemNode *node = cell.viewNode;
|
||||
node.viewId = model[@"id"];
|
||||
[node blend:props];
|
||||
DoricFlowLayoutItemNode *node = cell.viewNode;
|
||||
node.viewId = model[@"id"];
|
||||
[node blend:props];
|
||||
|
||||
BOOL fullSpan = self.loadMore && position >= self.itemCount;
|
||||
if (props[@"fullSpan"]) {
|
||||
fullSpan = [props[@"fullSpan"] boolValue];
|
||||
BOOL fullSpan = self.loadMore && position >= self.itemCount;
|
||||
if (props[@"fullSpan"]) {
|
||||
fullSpan = [props[@"fullSpan"] boolValue];
|
||||
}
|
||||
CGFloat width = fullSpan ? collectionView.width : (collectionView.width - (self.columnCount - 1) * self.columnSpace) / self.columnCount;
|
||||
CGFloat height = node.view.doricLayout.heightSpec == DoricLayoutFit ? CGFLOAT_MAX : collectionView.height;
|
||||
[node.view.doricLayout apply:CGSizeMake(width, height)];
|
||||
[node requestLayout];
|
||||
[self callItem:position size:node.view.frame.size];
|
||||
return cell;
|
||||
} @catch (NSException *exception) {
|
||||
[self.doricContext.driver.registry onException:exception inContext:self.doricContext];
|
||||
return nil;
|
||||
}
|
||||
CGFloat width = fullSpan ? collectionView.width : (collectionView.width - (self.columnCount - 1) * self.columnSpace) / self.columnCount;
|
||||
CGFloat height = node.view.doricLayout.heightSpec == DoricLayoutFit ? CGFLOAT_MAX : collectionView.height;
|
||||
[node.view.doricLayout apply:CGSizeMake(width, height)];
|
||||
[node requestLayout];
|
||||
[self callItem:position size:node.view.frame.size];
|
||||
return cell;
|
||||
}
|
||||
|
||||
- (NSIndexPath *)collectionView:(UICollectionView *)collectionView targetIndexPathForMoveFromItemAtIndexPath:(NSIndexPath *)currentIndexPath toProposedIndexPath:(NSIndexPath *)proposedIndexPath {
|
||||
|
@@ -240,37 +240,42 @@ - (void)callLoadMore {
|
||||
}
|
||||
|
||||
- (__kindof UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
|
||||
NSUInteger position = (NSUInteger) indexPath.row;
|
||||
NSDictionary *model = [self itemModelAt:position];
|
||||
NSDictionary *props = model[@"props"];
|
||||
NSString *identifier = props[@"identifier"] ?: @"doricCell";
|
||||
self.itemActions[@(position)] = props[@"actions"];
|
||||
if (self.loadMore
|
||||
&& position >= self.rowCount - 1
|
||||
&& self.onLoadMoreFuncId) {
|
||||
identifier = @"doricLoadMoreCell";
|
||||
[self callLoadMore];
|
||||
@try {
|
||||
NSUInteger position = (NSUInteger) indexPath.row;
|
||||
NSDictionary *model = [self itemModelAt:position];
|
||||
NSDictionary *props = model[@"props"];
|
||||
NSString *identifier = props[@"identifier"] ?: @"doricCell";
|
||||
self.itemActions[@(position)] = props[@"actions"];
|
||||
if (self.loadMore
|
||||
&& position >= self.rowCount - 1
|
||||
&& self.onLoadMoreFuncId) {
|
||||
identifier = @"doricLoadMoreCell";
|
||||
[self callLoadMore];
|
||||
}
|
||||
[collectionView registerClass:[DoricHorizontalTableViewCell class] forCellWithReuseIdentifier:identifier];
|
||||
DoricHorizontalTableViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:identifier forIndexPath:indexPath];
|
||||
if (!cell.doricHorizontalListItemNode) {
|
||||
DoricHorizontalListItemNode *itemNode = (DoricHorizontalListItemNode *) [DoricViewNode create:self.doricContext withType:@"HorizontalListItem"];
|
||||
[itemNode initWithSuperNode:self];
|
||||
cell.doricHorizontalListItemNode = itemNode;
|
||||
cell.backgroundColor = [UIColor clearColor];
|
||||
itemNode.view.height = collectionView.height;
|
||||
[cell.contentView addSubview:itemNode.view];
|
||||
} else {
|
||||
[cell.doricHorizontalListItemNode reset];
|
||||
}
|
||||
DoricHorizontalListItemNode *node = cell.doricHorizontalListItemNode;
|
||||
node.viewId = model[@"id"];
|
||||
[node blend:props];
|
||||
CGFloat width = node.view.doricLayout.widthSpec == DoricLayoutFit ? CGFLOAT_MAX : collectionView.width;
|
||||
[node.view.doricLayout apply:CGSizeMake(width, collectionView.height)];
|
||||
[node requestLayout];
|
||||
[self callItem:position width:node.view.width];
|
||||
return cell;
|
||||
} @catch (NSException *exception) {
|
||||
[self.doricContext.driver.registry onException:exception inContext:self.doricContext];
|
||||
return nil;
|
||||
}
|
||||
[collectionView registerClass:[DoricHorizontalTableViewCell class] forCellWithReuseIdentifier:identifier];
|
||||
DoricHorizontalTableViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:identifier forIndexPath:indexPath];
|
||||
if (!cell.doricHorizontalListItemNode) {
|
||||
DoricHorizontalListItemNode *itemNode = (DoricHorizontalListItemNode *) [DoricViewNode create:self.doricContext withType:@"HorizontalListItem"];
|
||||
[itemNode initWithSuperNode:self];
|
||||
cell.doricHorizontalListItemNode = itemNode;
|
||||
cell.backgroundColor = [UIColor clearColor];
|
||||
itemNode.view.height = collectionView.height;
|
||||
[cell.contentView addSubview:itemNode.view];
|
||||
} else {
|
||||
[cell.doricHorizontalListItemNode reset];
|
||||
}
|
||||
DoricHorizontalListItemNode *node = cell.doricHorizontalListItemNode;
|
||||
node.viewId = model[@"id"];
|
||||
[node blend:props];
|
||||
CGFloat width = node.view.doricLayout.widthSpec == DoricLayoutFit ? CGFLOAT_MAX : collectionView.width;
|
||||
[node.view.doricLayout apply:CGSizeMake(width, collectionView.height)];
|
||||
[node requestLayout];
|
||||
[self callItem:position width:node.view.width];
|
||||
return cell;
|
||||
}
|
||||
|
||||
- (CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout minimumInteritemSpacingForSectionAtIndex:(NSInteger)section {
|
||||
@@ -337,11 +342,11 @@ - (void)blendSubNode:(NSDictionary *)subModel {
|
||||
NSString *viewId = subModel[@"id"];
|
||||
DoricViewNode *viewNode = [self subNodeWithViewId:viewId];
|
||||
BOOL skipReload = NO;
|
||||
|
||||
|
||||
NSMutableDictionary *model = [[self subModelOf:viewId] mutableCopy];
|
||||
[self recursiveMixin:subModel to:model];
|
||||
[self setSubModel:model in:viewId];
|
||||
|
||||
|
||||
if (viewNode) {
|
||||
CGSize originSize = viewNode.view.frame.size;
|
||||
[viewNode blend:subModel[@"props"]];
|
||||
@@ -351,7 +356,7 @@ - (void)blendSubNode:(NSDictionary *)subModel {
|
||||
skipReload = YES;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (skipReload) {
|
||||
return;
|
||||
}
|
||||
|
@@ -242,37 +242,42 @@ - (void)callLoadMore {
|
||||
}
|
||||
|
||||
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
|
||||
NSUInteger position = (NSUInteger) indexPath.row;
|
||||
NSDictionary *model = [self itemModelAt:position];
|
||||
NSDictionary *props = model[@"props"];
|
||||
NSString *reuseId = props[@"identifier"];
|
||||
self.itemActions[@(position)] = props[@"actions"];
|
||||
if (self.loadMore
|
||||
&& position >= self.rowCount - 1
|
||||
&& self.onLoadMoreFuncId) {
|
||||
reuseId = @"doricLoadMoreCell";
|
||||
[self callLoadMore];
|
||||
@try {
|
||||
NSUInteger position = (NSUInteger) indexPath.row;
|
||||
NSDictionary *model = [self itemModelAt:position];
|
||||
NSDictionary *props = model[@"props"];
|
||||
NSString *reuseId = props[@"identifier"];
|
||||
self.itemActions[@(position)] = props[@"actions"];
|
||||
if (self.loadMore
|
||||
&& position >= self.rowCount - 1
|
||||
&& self.onLoadMoreFuncId) {
|
||||
reuseId = @"doricLoadMoreCell";
|
||||
[self callLoadMore];
|
||||
}
|
||||
DoricTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:reuseId ?: @"doricCell"];
|
||||
if (!cell) {
|
||||
cell = [[DoricTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:reuseId ?: @"doricCell"];
|
||||
DoricListItemNode *listItemNode = (DoricListItemNode *) [DoricViewNode create:self.doricContext withType:@"ListItem"];
|
||||
[listItemNode initWithSuperNode:self];
|
||||
cell.doricListItemNode = listItemNode;
|
||||
cell.backgroundColor = [UIColor clearColor];
|
||||
listItemNode.view.width = tableView.width;
|
||||
[cell.contentView addSubview:listItemNode.view];
|
||||
} else {
|
||||
[cell.doricListItemNode reset];
|
||||
}
|
||||
DoricListItemNode *node = cell.doricListItemNode;
|
||||
node.viewId = model[@"id"];
|
||||
[node blend:props];
|
||||
CGFloat height = node.view.doricLayout.heightSpec == DoricLayoutFit ? CGFLOAT_MAX : tableView.height;
|
||||
[node.view.doricLayout apply:CGSizeMake(tableView.width, height)];
|
||||
[node requestLayout];
|
||||
[self callItem:position height:node.view.height];
|
||||
return cell;
|
||||
} @catch (NSException *exception) {
|
||||
[self.doricContext.driver.registry onException:exception inContext:self.doricContext];
|
||||
return nil;
|
||||
}
|
||||
DoricTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:reuseId ?: @"doricCell"];
|
||||
if (!cell) {
|
||||
cell = [[DoricTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:reuseId ?: @"doricCell"];
|
||||
DoricListItemNode *listItemNode = (DoricListItemNode *) [DoricViewNode create:self.doricContext withType:@"ListItem"];
|
||||
[listItemNode initWithSuperNode:self];
|
||||
cell.doricListItemNode = listItemNode;
|
||||
cell.backgroundColor = [UIColor clearColor];
|
||||
listItemNode.view.width = tableView.width;
|
||||
[cell.contentView addSubview:listItemNode.view];
|
||||
} else {
|
||||
[cell.doricListItemNode reset];
|
||||
}
|
||||
DoricListItemNode *node = cell.doricListItemNode;
|
||||
node.viewId = model[@"id"];
|
||||
[node blend:props];
|
||||
CGFloat height = node.view.doricLayout.heightSpec == DoricLayoutFit ? CGFLOAT_MAX : tableView.height;
|
||||
[node.view.doricLayout apply:CGSizeMake(tableView.width, height)];
|
||||
[node requestLayout];
|
||||
[self callItem:position height:node.view.height];
|
||||
return cell;
|
||||
}
|
||||
|
||||
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
|
||||
@@ -381,11 +386,11 @@ - (void)blendSubNode:(NSDictionary *)subModel {
|
||||
NSString *viewId = subModel[@"id"];
|
||||
DoricViewNode *viewNode = [self subNodeWithViewId:viewId];
|
||||
BOOL skipReload = NO;
|
||||
|
||||
|
||||
NSMutableDictionary *model = [[self subModelOf:viewId] mutableCopy];
|
||||
[self recursiveMixin:subModel to:model];
|
||||
[self setSubModel:model in:viewId];
|
||||
|
||||
|
||||
if (viewNode) {
|
||||
CGSize originSize = viewNode.view.frame.size;
|
||||
[viewNode blend:subModel[@"props"]];
|
||||
|
@@ -177,24 +177,29 @@ - (CGFloat)collectionView:(UICollectionView *)collectionView layout:(UICollectio
|
||||
}
|
||||
|
||||
- (__kindof UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath {
|
||||
NSUInteger position = (NSUInteger) indexPath.row;
|
||||
NSDictionary *model = [self itemModelAt:position];
|
||||
NSDictionary *props = model[@"props"];
|
||||
DoricSliderViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"doricCell" forIndexPath:indexPath];
|
||||
if (!cell.doricSlideItemNode) {
|
||||
DoricSlideItemNode *slideItemNode = (DoricSlideItemNode *) [DoricViewNode create:self.doricContext withType:@"SlideItem"];
|
||||
[slideItemNode initWithSuperNode:self];
|
||||
cell.doricSlideItemNode = slideItemNode;
|
||||
[cell.contentView addSubview:slideItemNode.view];
|
||||
} else {
|
||||
[cell.doricSlideItemNode reset];
|
||||
@try {
|
||||
NSUInteger position = (NSUInteger) indexPath.row;
|
||||
NSDictionary *model = [self itemModelAt:position];
|
||||
NSDictionary *props = model[@"props"];
|
||||
DoricSliderViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:@"doricCell" forIndexPath:indexPath];
|
||||
if (!cell.doricSlideItemNode) {
|
||||
DoricSlideItemNode *slideItemNode = (DoricSlideItemNode *) [DoricViewNode create:self.doricContext withType:@"SlideItem"];
|
||||
[slideItemNode initWithSuperNode:self];
|
||||
cell.doricSlideItemNode = slideItemNode;
|
||||
[cell.contentView addSubview:slideItemNode.view];
|
||||
} else {
|
||||
[cell.doricSlideItemNode reset];
|
||||
}
|
||||
DoricSlideItemNode *node = cell.doricSlideItemNode;
|
||||
node.viewId = model[@"id"];
|
||||
[node blend:props];
|
||||
[node.view.doricLayout apply:CGSizeMake(collectionView.width, collectionView.height)];
|
||||
[node requestLayout];
|
||||
return cell;
|
||||
} @catch (NSException *exception) {
|
||||
[self.doricContext.driver.registry onException:exception inContext:self.doricContext];
|
||||
return nil;
|
||||
}
|
||||
DoricSlideItemNode *node = cell.doricSlideItemNode;
|
||||
node.viewId = model[@"id"];
|
||||
[node blend:props];
|
||||
[node.view.doricLayout apply:CGSizeMake(collectionView.width, collectionView.height)];
|
||||
[node requestLayout];
|
||||
return cell;
|
||||
}
|
||||
|
||||
- (BOOL)collectionView:(UICollectionView *)collectionView shouldSelectItemAtIndexPath:(NSIndexPath *)indexPath {
|
||||
@@ -253,11 +258,11 @@ - (void)blendSubNode:(NSDictionary *)subModel {
|
||||
NSString *viewId = subModel[@"id"];
|
||||
DoricViewNode *viewNode = [self subNodeWithViewId:viewId];
|
||||
BOOL skipReload = NO;
|
||||
|
||||
|
||||
NSMutableDictionary *model = [[self subModelOf:viewId] mutableCopy];
|
||||
[self recursiveMixin:subModel to:model];
|
||||
[self setSubModel:model in:viewId];
|
||||
|
||||
|
||||
if (viewNode) {
|
||||
CGSize originSize = viewNode.view.frame.size;
|
||||
[viewNode blend:subModel[@"props"]];
|
||||
|
Reference in New Issue
Block a user