diff --git a/README.md b/README.md index 5dcf0f1..0c5eed5 100644 --- a/README.md +++ b/README.md @@ -455,7 +455,45 @@ typedef NS_ENUM(NSInteger, SSJStaticCellType) { >为了方便比较,同组页面的定制和分组是一致的。我们可以看到,定制代码都作用于cell的viewModel上了。 +## 4. 刷新数据源 ---- +支持更新数据源后,刷新数据源。试着在发现页模拟网络请求,在请求结束后更新某个cell的viewmodel。举个例子:刷新一下发现页里最后一行的cell: -非常感谢你的阅读,觉得不好请多批评 +```objc +//模拟网络请求 + dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ + + //请求成功x + NSDictionary *responseDict = @{@"title_info":@"新游戏上架啦", + @"title_icon":@"game_1", + @"game_info":@"一起来玩斗地主呀!", + @"game_icon":@"doudizhu" + }; + //将要刷新cell的indexPath + NSIndexPath *indexPath = [NSIndexPath indexPathForRow:1 inSection:3]; + + //获取cell对应的viewModel + SJStaticTableviewCellViewModel *viewModel = [self.dataSource tableView:self.tableView cellViewModelAtIndexPath:indexPath]; + + if (viewModel) { + //更新viewModel + viewModel.leftTitle = responseDict[@"title_info"]; + viewModel.leftImage = [UIImage imageNamed:responseDict[@"title_icon"]]; + viewModel.indicatorLeftImage = [UIImage imageNamed:responseDict[@"game_icon"]]; + viewModel.indicatorLeftTitle = responseDict[@"game_info"]; + + //刷新tableview + [self.tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade]; + } + }); +``` + +效果图: + +![](http://oih3a9o4n.bkt.clouddn.com/sjstatictableview_7.png) + + +## License + +SJStaticTableView is released under the MIT license. diff --git a/SJStaticTableViewDemo/SJStaticTableViewDemo.xcodeproj/project.pbxproj b/SJStaticTableViewDemo/SJStaticTableViewDemo.xcodeproj/project.pbxproj index 39e4fe8..0f1894b 100644 --- a/SJStaticTableViewDemo/SJStaticTableViewDemo.xcodeproj/project.pbxproj +++ b/SJStaticTableViewDemo/SJStaticTableViewDemo.xcodeproj/project.pbxproj @@ -149,33 +149,33 @@ CB67C3B31EA9DF4D00B6125B /* SJStaticTableViewComponent */ = { isa = PBXGroup; children = ( + CB67C3B61EA9DF4D00B6125B /* Resources */, CB67C3B41EA9DF4D00B6125B /* Factory.h */, CB67C3B51EA9DF4D00B6125B /* Factory.m */, - CB67C3B61EA9DF4D00B6125B /* Resources */, CB67C3B81EA9DF4D00B6125B /* SJConst.h */, CB67C3B91EA9DF4D00B6125B /* SJStaticTableView.h */, CB67C3BA1EA9DF4D00B6125B /* SJStaticTableView.m */, - CB67C3BB1EA9DF4D00B6125B /* SJStaticTableViewCell+AccessoryDisclosureIndicator.h */, - CB67C3BC1EA9DF4D00B6125B /* SJStaticTableViewCell+AccessoryDisclosureIndicator.m */, - CB67C3BD1EA9DF4D00B6125B /* SJStaticTableViewCell+AccessoryNone.h */, - CB67C3BE1EA9DF4D00B6125B /* SJStaticTableViewCell+AccessoryNone.m */, - CB67C3BF1EA9DF4D00B6125B /* SJStaticTableViewCell+AccessorySwitch.h */, - CB67C3C01EA9DF4D00B6125B /* SJStaticTableViewCell+AccessorySwitch.m */, + CB67C3C51EA9DF4D00B6125B /* SJStaticTableViewCell.h */, + CB67C3C61EA9DF4D00B6125B /* SJStaticTableViewCell.m */, CB67C3C11EA9DF4D00B6125B /* SJStaticTableViewCell+Logout.h */, CB67C3C21EA9DF4D00B6125B /* SJStaticTableViewCell+Logout.m */, CB67C3C31EA9DF4D00B6125B /* SJStaticTableViewCell+MeAvatar.h */, CB67C3C41EA9DF4D00B6125B /* SJStaticTableViewCell+MeAvatar.m */, - CB67C3C51EA9DF4D00B6125B /* SJStaticTableViewCell.h */, - CB67C3C61EA9DF4D00B6125B /* SJStaticTableViewCell.m */, + CB67C3BD1EA9DF4D00B6125B /* SJStaticTableViewCell+AccessoryNone.h */, + CB67C3BE1EA9DF4D00B6125B /* SJStaticTableViewCell+AccessoryNone.m */, + CB67C3BF1EA9DF4D00B6125B /* SJStaticTableViewCell+AccessorySwitch.h */, + CB67C3C01EA9DF4D00B6125B /* SJStaticTableViewCell+AccessorySwitch.m */, + CB67C3BB1EA9DF4D00B6125B /* SJStaticTableViewCell+AccessoryDisclosureIndicator.h */, + CB67C3BC1EA9DF4D00B6125B /* SJStaticTableViewCell+AccessoryDisclosureIndicator.m */, CB67C3C71EA9DF4D00B6125B /* SJStaticTableviewCellViewModel.h */, CB67C3C81EA9DF4D00B6125B /* SJStaticTableviewCellViewModel.m */, - CB67C3C91EA9DF4D00B6125B /* SJStaticTableViewController.h */, - CB67C3CA1EA9DF4D00B6125B /* SJStaticTableViewController.m */, + CB67C3CE1EA9DF4D00B6125B /* SJStaticTableviewSectionViewModel.h */, + CB67C3CF1EA9DF4D00B6125B /* SJStaticTableviewSectionViewModel.m */, CB67C3CB1EA9DF4D00B6125B /* SJStaticTableViewDataSource.h */, CB67C3CC1EA9DF4D00B6125B /* SJStaticTableViewDataSource.m */, + CB67C3C91EA9DF4D00B6125B /* SJStaticTableViewController.h */, + CB67C3CA1EA9DF4D00B6125B /* SJStaticTableViewController.m */, CB67C3CD1EA9DF4D00B6125B /* SJStaticTableViewHeader.h */, - CB67C3CE1EA9DF4D00B6125B /* SJStaticTableviewSectionViewModel.h */, - CB67C3CF1EA9DF4D00B6125B /* SJStaticTableviewSectionViewModel.m */, ); path = SJStaticTableViewComponent; sourceTree = ""; diff --git a/SJStaticTableViewDemo/SJStaticTableViewDemo.xcodeproj/project.xcworkspace/xcuserdata/SunShijie.xcuserdatad/UserInterfaceState.xcuserstate b/SJStaticTableViewDemo/SJStaticTableViewDemo.xcodeproj/project.xcworkspace/xcuserdata/SunShijie.xcuserdatad/UserInterfaceState.xcuserstate index fdd783b..73d1f20 100644 Binary files a/SJStaticTableViewDemo/SJStaticTableViewDemo.xcodeproj/project.xcworkspace/xcuserdata/SunShijie.xcuserdatad/UserInterfaceState.xcuserstate and b/SJStaticTableViewDemo/SJStaticTableViewDemo.xcodeproj/project.xcworkspace/xcuserdata/SunShijie.xcuserdatad/UserInterfaceState.xcuserstate differ diff --git a/SJStaticTableViewDemo/SJStaticTableViewDemo.xcodeproj/xcuserdata/SunShijie.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist b/SJStaticTableViewDemo/SJStaticTableViewDemo.xcodeproj/xcuserdata/SunShijie.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist new file mode 100644 index 0000000..8f94031 --- /dev/null +++ b/SJStaticTableViewDemo/SJStaticTableViewDemo.xcodeproj/xcuserdata/SunShijie.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist @@ -0,0 +1,17 @@ + + + + + + + + + diff --git a/SJStaticTableViewDemo/SJStaticTableViewDemo/Discover.xcassets/doudizhu.imageset/Contents.json b/SJStaticTableViewDemo/SJStaticTableViewDemo/Discover.xcassets/doudizhu.imageset/Contents.json new file mode 100644 index 0000000..0867af4 --- /dev/null +++ b/SJStaticTableViewDemo/SJStaticTableViewDemo/Discover.xcassets/doudizhu.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "doudizhu@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/SJStaticTableViewDemo/SJStaticTableViewDemo/Discover.xcassets/doudizhu.imageset/doudizhu@2x.png b/SJStaticTableViewDemo/SJStaticTableViewDemo/Discover.xcassets/doudizhu.imageset/doudizhu@2x.png new file mode 100644 index 0000000..bf71642 Binary files /dev/null and b/SJStaticTableViewDemo/SJStaticTableViewDemo/Discover.xcassets/doudizhu.imageset/doudizhu@2x.png differ diff --git a/SJStaticTableViewDemo/SJStaticTableViewDemo/Discover.xcassets/game_1.imageset/Contents.json b/SJStaticTableViewDemo/SJStaticTableViewDemo/Discover.xcassets/game_1.imageset/Contents.json new file mode 100644 index 0000000..0dcf284 --- /dev/null +++ b/SJStaticTableViewDemo/SJStaticTableViewDemo/Discover.xcassets/game_1.imageset/Contents.json @@ -0,0 +1,21 @@ +{ + "images" : [ + { + "idiom" : "universal", + "scale" : "1x" + }, + { + "idiom" : "universal", + "filename" : "game_1@2x.png", + "scale" : "2x" + }, + { + "idiom" : "universal", + "scale" : "3x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/SJStaticTableViewDemo/SJStaticTableViewDemo/Discover.xcassets/game_1.imageset/game_1@2x.png b/SJStaticTableViewDemo/SJStaticTableViewDemo/Discover.xcassets/game_1.imageset/game_1@2x.png new file mode 100644 index 0000000..b6dc65e Binary files /dev/null and b/SJStaticTableViewDemo/SJStaticTableViewDemo/Discover.xcassets/game_1.imageset/game_1@2x.png differ diff --git a/SJStaticTableViewDemo/SJStaticTableViewDemo/SJStaticTableViewComponent/SJStaticTableViewCell+AccessoryDisclosureIndicator.h b/SJStaticTableViewDemo/SJStaticTableViewDemo/SJStaticTableViewComponent/SJStaticTableViewCell+AccessoryDisclosureIndicator.h index 737045f..b723892 100644 --- a/SJStaticTableViewDemo/SJStaticTableViewDemo/SJStaticTableViewComponent/SJStaticTableViewCell+AccessoryDisclosureIndicator.h +++ b/SJStaticTableViewDemo/SJStaticTableViewDemo/SJStaticTableViewComponent/SJStaticTableViewCell+AccessoryDisclosureIndicator.h @@ -9,5 +9,7 @@ #import "SJStaticTableViewCell.h" @interface SJStaticTableViewCell (AccessoryDisclosureIndicator) + - (void)configureAccessoryDisclosureIndicatorCellWithViewModel:(SJStaticTableviewCellViewModel *)viewModel; + @end diff --git a/SJStaticTableViewDemo/SJStaticTableViewDemo/SJStaticTableViewComponent/SJStaticTableViewCell+AccessoryDisclosureIndicator.m b/SJStaticTableViewDemo/SJStaticTableViewDemo/SJStaticTableViewComponent/SJStaticTableViewCell+AccessoryDisclosureIndicator.m index 3dfff8e..f6250e6 100644 --- a/SJStaticTableViewDemo/SJStaticTableViewDemo/SJStaticTableViewComponent/SJStaticTableViewCell+AccessoryDisclosureIndicator.m +++ b/SJStaticTableViewDemo/SJStaticTableViewDemo/SJStaticTableViewComponent/SJStaticTableViewCell+AccessoryDisclosureIndicator.m @@ -9,9 +9,10 @@ #import "SJStaticTableViewCell+AccessoryDisclosureIndicator.h" @implementation SJStaticTableViewCell (AccessoryDisclosureIndicator) + - (void)configureAccessoryDisclosureIndicatorCellWithViewModel:(SJStaticTableviewCellViewModel *)viewModel { - + //左侧控件的配置 [self layoutLeftPartSubViewsWithViewModel:viewModel]; //右侧存在箭头 @@ -20,12 +21,60 @@ - (void)configureAccessoryDisclosureIndicatorCellWithViewModel:(SJStaticTablevie //右侧存在箭头+文字 if ( (viewModel.indicatorLeftTitle) && (viewModel.indicatorLeftLabelSize.width != 0)) { [self.contentView addSubview:self.indicatorLeftLabel]; + [self configureIndicatorLeftLabel]; } //右侧存在箭头+图片 if ((self.viewModel.indicatorLeftImage) && (viewModel.indicatorLeftImageSize.height != 0)){ [self.contentView addSubview:self.indicatorLeftImageView]; + [self configureIndicatorLeftImage]; } +} + +//将右侧label的配置从懒加载里抽出来 +- (void)configureIndicatorLeftLabel +{ + + self.indicatorLeftLabel.font = self.viewModel.indicatorLeftLabelTextFont; + self.indicatorLeftLabel.textColor = self.viewModel.indicatorLeftLabelTextColor; + self.indicatorLeftLabel.text = self.viewModel.indicatorLeftTitle; + if (!self.viewModel.hasIndicatorImageAndLabel) { + //只存在右侧Label + self.indicatorLeftLabel.frame = CGRectMake(self.indicatorArrow.frame.origin.x - SJLeftGap - self.viewModel.indicatorLeftLabelSize.width , (self.viewModel.cellHeight - self.viewModel.indicatorLeftLabelSize.height)/2, self.viewModel.indicatorLeftLabelSize.width, self.viewModel.indicatorLeftLabelSize.height); + }else{ + //右侧Label和image同时存在 + if (self.viewModel.isImageFirst) { + + self.indicatorLeftLabel.frame = CGRectMake(SJScreenWidth - SJLeftGap - self.indicatorArrow.bounds.size.width - self.viewModel.indicatorLeftImageAndLabelGap - self.viewModel.indicatorLeftImageSize.width - SJLeftGap - self.viewModel.indicatorLeftLabelSize.width, (self.viewModel.cellHeight - self.viewModel.indicatorLeftLabelSize.height)/2, self.viewModel.indicatorLeftLabelSize.width, self.viewModel.indicatorLeftLabelSize.height); + + }else{ + + self.indicatorLeftLabel.frame = CGRectMake(SJScreenWidth - SJLeftGap - self.indicatorArrow.bounds.size.width - SJLeftGap - self.viewModel.indicatorLeftLabelSize.width, (self.viewModel.cellHeight - self.viewModel.indicatorLeftLabelSize.height)/2, self.viewModel.indicatorLeftLabelSize.width, self.viewModel.indicatorLeftLabelSize.height); + } + } } + +//将右侧image的配置从懒加载里抽出来 +- (void)configureIndicatorLeftImage +{ + self.indicatorLeftImageView.image = self.viewModel.indicatorLeftImage; + + if (!self.viewModel.hasIndicatorImageAndLabel) { + //只存在右侧image + self.indicatorLeftImageView.frame = CGRectMake(self.indicatorArrow.frame.origin.x - SJLeftGap - self.viewModel.indicatorLeftImageSize.width, (self.viewModel.cellHeight - self.viewModel.indicatorLeftImageSize.height)/2, self.viewModel.indicatorLeftImageSize.width , self.viewModel.indicatorLeftImageSize.height); + }else{ + //右侧Label和image同时存在 + if (self.viewModel.isImageFirst) { + + self.indicatorLeftImageView.frame = CGRectMake(SJScreenWidth - SJLeftGap - self.indicatorArrow.bounds.size.width - SJLeftGap - self.viewModel.indicatorLeftImageSize.width, (self.viewModel.cellHeight - self.viewModel.indicatorLeftImageSize.height)/2, self.viewModel.indicatorLeftImageSize.width, self.viewModel.indicatorLeftImageSize.height); + + }else{ + + self.indicatorLeftImageView.frame = CGRectMake(SJScreenWidth - SJLeftGap - self.indicatorArrow.bounds.size.width - self.viewModel.indicatorLeftImageAndLabelGap - self.viewModel.indicatorLeftLabelSize.width - SJLeftGap - self.viewModel.indicatorLeftImageSize.width, (self.viewModel.cellHeight - self.viewModel.indicatorLeftImageSize.height)/2, self.viewModel.indicatorLeftImageSize.width,self.viewModel.indicatorLeftImageSize.height); + } + + } +} + @end diff --git a/SJStaticTableViewDemo/SJStaticTableViewDemo/SJStaticTableViewComponent/SJStaticTableViewCell.h b/SJStaticTableViewDemo/SJStaticTableViewDemo/SJStaticTableViewComponent/SJStaticTableViewCell.h index 8af7f20..59c995d 100644 --- a/SJStaticTableViewDemo/SJStaticTableViewDemo/SJStaticTableViewComponent/SJStaticTableViewCell.h +++ b/SJStaticTableViewDemo/SJStaticTableViewDemo/SJStaticTableViewComponent/SJStaticTableViewCell.h @@ -41,4 +41,5 @@ //统一的,布局cell左侧部分的内容(标题 / 图片 + 标题),所有系统风格的cell都要调用这个方法 - (void)layoutLeftPartSubViewsWithViewModel:(SJStaticTableviewCellViewModel *)viewModel; + @end diff --git a/SJStaticTableViewDemo/SJStaticTableViewDemo/SJStaticTableViewComponent/SJStaticTableViewCell.m b/SJStaticTableViewDemo/SJStaticTableViewDemo/SJStaticTableViewComponent/SJStaticTableViewCell.m index f1254b1..5438cae 100644 --- a/SJStaticTableViewDemo/SJStaticTableViewDemo/SJStaticTableViewComponent/SJStaticTableViewCell.m +++ b/SJStaticTableViewDemo/SJStaticTableViewDemo/SJStaticTableViewComponent/SJStaticTableViewCell.m @@ -17,16 +17,37 @@ - (void)layoutLeftPartSubViewsWithViewModel:(SJStaticTableviewCellViewModel *)vi //存在最左边的图片 if (self.viewModel.leftImage) { + [self.contentView addSubview:self.leftImageView]; + + self.leftImageView.image = self.viewModel.leftImage; + self.leftImageView.frame = CGRectMake(SJLeftGap, (self.viewModel.cellHeight - self.viewModel.leftImageSize.height)/2, self.viewModel.leftImageSize.width , self.viewModel.leftImageSize.height); } + //存在标题文字 if (self.viewModel.leftTitle.length) { + [self.contentView addSubview:self.leftTitleLabel]; + + self.leftTitleLabel.font = self.viewModel.leftLabelTextFont; + self.leftTitleLabel.textColor = self.viewModel.leftLabelTextColor; + self.leftTitleLabel.text = self.viewModel.leftTitle; + + CGFloat x = 0; + if (_leftImageView) { + x = CGRectGetMaxX(self.leftImageView.frame) + self.viewModel.leftImageAndLabelGap; + }else{ + x = SJLeftGap; + } + + self.leftTitleLabel.frame = CGRectMake( x, (self.viewModel.cellHeight - self.viewModel.leftTitleLabelSize.height)/2, self.viewModel.leftTitleLabelSize.width, self.viewModel.leftTitleLabelSize.height); } + } + #pragma mark- switch block - (void)switchTouched:(UISwitch *)indicatorSwitch { @@ -41,8 +62,7 @@ - (void)switchTouched:(UISwitch *)indicatorSwitch - (UIImageView *)leftImageView { if (!_leftImageView) { - _leftImageView = [[UIImageView alloc] initWithImage:_viewModel.leftImage]; - _leftImageView.frame = CGRectMake(SJLeftGap, (_viewModel.cellHeight - _viewModel.leftImageSize.height)/2, _viewModel.leftImageSize.width , _viewModel.leftImageSize.height); + _leftImageView = [[UIImageView alloc] init]; } return _leftImageView; } @@ -51,16 +71,6 @@ - (UILabel *)leftTitleLabel { if (!_leftTitleLabel) { _leftTitleLabel= [[UILabel alloc] init]; - _leftTitleLabel.font = _viewModel.leftLabelTextFont; - _leftTitleLabel.textColor = _viewModel.leftLabelTextColor; - _leftTitleLabel.text = _viewModel.leftTitle; - CGFloat x = 0; - if (_leftImageView) { - x = CGRectGetMaxX(_leftImageView.frame) + _viewModel.leftImageAndLabelGap; - }else{ - x = SJLeftGap; - } - _leftTitleLabel.frame = CGRectMake( x, (_viewModel.cellHeight - _viewModel.leftTitleLabelSize.height)/2, _viewModel.leftTitleLabelSize.width, _viewModel.leftTitleLabelSize.height); } return _leftTitleLabel; } @@ -82,33 +92,14 @@ - (UIImageView *)indicatorArrow if (!_indicatorArrow) { _indicatorArrow = [[UIImageView alloc] initWithImage:[UIImage imageNamed:SJIndicatorArrow]]; _indicatorArrow.frame = CGRectMake(SJScreenWidth - SJLeftGap - _indicatorArrow.bounds.size.width, (_viewModel.cellHeight - _indicatorArrow.bounds.size.height)/2, _indicatorArrow.bounds.size.width, _indicatorArrow.bounds.size.height); - } - + } return _indicatorArrow; } - (UILabel *)indicatorLeftLabel { if (!_indicatorLeftLabel) { - _indicatorLeftLabel= [[UILabel alloc] init]; - _indicatorLeftLabel.font = _viewModel.indicatorLeftLabelTextFont; - _indicatorLeftLabel.textColor = _viewModel.indicatorLeftLabelTextColor; - _indicatorLeftLabel.text = _viewModel.indicatorLeftTitle; - - if (!_viewModel.hasIndicatorImageAndLabel) { - _indicatorLeftLabel.frame = CGRectMake(_indicatorArrow.frame.origin.x - SJLeftGap - _viewModel.indicatorLeftLabelSize.width , (_viewModel.cellHeight - _viewModel.indicatorLeftLabelSize.height)/2, _viewModel.indicatorLeftLabelSize.width, _viewModel.indicatorLeftLabelSize.height); - }else{ - //同时存在 - if (_viewModel.isImageFirst) { - - _indicatorLeftLabel.frame = CGRectMake(SJScreenWidth - SJLeftGap - _indicatorArrow.bounds.size.width - _viewModel.indicatorLeftImageAndLabelGap - _viewModel.indicatorLeftImageSize.width - SJLeftGap - _viewModel.indicatorLeftLabelSize.width, (_viewModel.cellHeight - _viewModel.indicatorLeftLabelSize.height)/2, _viewModel.indicatorLeftLabelSize.width, _viewModel.indicatorLeftLabelSize.height); - - }else{ - - _indicatorLeftLabel.frame = CGRectMake(SJScreenWidth - SJLeftGap - _indicatorArrow.bounds.size.width - SJLeftGap - _viewModel.indicatorLeftLabelSize.width, (_viewModel.cellHeight - _viewModel.indicatorLeftLabelSize.height)/2, _viewModel.indicatorLeftLabelSize.width, _viewModel.indicatorLeftLabelSize.height); - } - } - + _indicatorLeftLabel= [[UILabel alloc] init]; } return _indicatorLeftLabel; } @@ -116,24 +107,7 @@ - (UILabel *)indicatorLeftLabel - (UIImageView *)indicatorLeftImageView { if (!_indicatorLeftImageView) { - _indicatorLeftImageView = [[UIImageView alloc] initWithImage:_viewModel.indicatorLeftImage]; - - if (!_viewModel.hasIndicatorImageAndLabel) { - _indicatorLeftImageView.frame = CGRectMake(_indicatorArrow.frame.origin.x - SJLeftGap - _viewModel.indicatorLeftImageSize.width, (_viewModel.cellHeight - _viewModel.indicatorLeftImageSize.height)/2, _viewModel.indicatorLeftImageSize.width , _viewModel.indicatorLeftImageSize.height); - }else{ - - if (_viewModel.isImageFirst) { - - _indicatorLeftImageView.frame = CGRectMake(SJScreenWidth - SJLeftGap - _indicatorArrow.bounds.size.width - SJLeftGap - _viewModel.indicatorLeftImageSize.width, (_viewModel.cellHeight - _viewModel.indicatorLeftImageSize.height)/2, _viewModel.indicatorLeftImageSize.width, _viewModel.indicatorLeftImageSize.height); - - }else{ - - _indicatorLeftImageView.frame = CGRectMake(SJScreenWidth - SJLeftGap - _indicatorArrow.bounds.size.width - _viewModel.indicatorLeftImageAndLabelGap - _viewModel.indicatorLeftLabelSize.width - SJLeftGap - _viewModel.indicatorLeftImageSize.width, (_viewModel.cellHeight - _viewModel.indicatorLeftImageSize.height)/2, _viewModel.indicatorLeftImageSize.width,_viewModel.indicatorLeftImageSize.height); - - } - - } - + _indicatorLeftImageView = [[UIImageView alloc] init]; } return _indicatorLeftImageView; } diff --git a/SJStaticTableViewDemo/SJStaticTableViewDemo/SJStaticTableViewComponent/SJStaticTableViewController.h b/SJStaticTableViewDemo/SJStaticTableViewDemo/SJStaticTableViewComponent/SJStaticTableViewController.h index 8dfc7ca..cdaf41a 100644 --- a/SJStaticTableViewDemo/SJStaticTableViewDemo/SJStaticTableViewComponent/SJStaticTableViewController.h +++ b/SJStaticTableViewDemo/SJStaticTableViewDemo/SJStaticTableViewComponent/SJStaticTableViewController.h @@ -10,6 +10,7 @@ #import "SJStaticTableViewHeader.h" #import "Factory.h"//假数据 + @protocol SJStaticTableViewControllerDelegate @required @@ -21,4 +22,7 @@ @property (nonatomic, strong) SJStaticTableView *tableView; @property (nonatomic, strong) SJStaticTableViewDataSource *dataSource; + +- (SJStaticTableviewCellViewModel *)retrieveCellViewModelAtIndexPath:(NSIndexPath *)indexPath; + @end diff --git a/SJStaticTableViewDemo/SJStaticTableViewDemo/SJStaticTableViewComponent/SJStaticTableViewController.m b/SJStaticTableViewDemo/SJStaticTableViewDemo/SJStaticTableViewComponent/SJStaticTableViewController.m index 18a3742..be68aeb 100644 --- a/SJStaticTableViewDemo/SJStaticTableViewDemo/SJStaticTableViewComponent/SJStaticTableViewController.m +++ b/SJStaticTableViewDemo/SJStaticTableViewDemo/SJStaticTableViewComponent/SJStaticTableViewController.m @@ -9,8 +9,11 @@ #import "SJStaticTableViewController.h" #import "SJStaticTableViewDataSource.h" +@interface SJStaticTableViewController() +@end + @implementation SJStaticTableViewController diff --git a/SJStaticTableViewDemo/SJStaticTableViewDemo/SJStaticTableViewComponent/SJStaticTableViewDataSource.m b/SJStaticTableViewDemo/SJStaticTableViewDemo/SJStaticTableViewComponent/SJStaticTableViewDataSource.m index d9859bf..1020336 100644 --- a/SJStaticTableViewDemo/SJStaticTableViewDemo/SJStaticTableViewComponent/SJStaticTableViewDataSource.m +++ b/SJStaticTableViewDemo/SJStaticTableViewDemo/SJStaticTableViewComponent/SJStaticTableViewDataSource.m @@ -20,6 +20,8 @@ @interface SJStaticTableViewDataSource() @implementation SJStaticTableViewDataSource +#pragma mark- Public API + - (instancetype)initWithViewModelsArray:(NSArray *)viewModelsArray configureBlock:(SJStaticCellConfigureBlock)block { self = [super init]; @@ -30,6 +32,7 @@ - (instancetype)initWithViewModelsArray:(NSArray *)viewModelsArray configureBloc return self; } +#pragma mark- SJStaticTableViewDataSource - (SJStaticTableviewCellViewModel *)tableView:(UITableView *)tableview cellViewModelAtIndexPath:(NSIndexPath *)indexPath { if (self.viewModelsArray.count > indexPath.section) { @@ -49,7 +52,7 @@ - (SJStaticTableviewSectionViewModel *)tableView:(UITableView *)tableView sectio return nil; } -#pragma mark - Tableview data source +#pragma mark - Tableview Datasource - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { @@ -64,7 +67,7 @@ - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { - + SJStaticTableviewSectionViewModel *sectionViewModel = self.viewModelsArray[indexPath.section]; SJStaticTableviewCellViewModel *cellViewModel = sectionViewModel.cellViewModelsArray[indexPath.row]; diff --git a/SJStaticTableViewDemo/SJStaticTableViewDemo/SJStaticTableViewComponent/SJStaticTableviewSectionViewModel.h b/SJStaticTableViewDemo/SJStaticTableViewDemo/SJStaticTableViewComponent/SJStaticTableviewSectionViewModel.h index 7e0578d..4988504 100644 --- a/SJStaticTableViewDemo/SJStaticTableViewDemo/SJStaticTableViewComponent/SJStaticTableviewSectionViewModel.h +++ b/SJStaticTableViewDemo/SJStaticTableViewDemo/SJStaticTableViewComponent/SJStaticTableviewSectionViewModel.h @@ -13,7 +13,7 @@ @property (nonatomic, copy) NSString *sectionHeaderTitle; //该section的标题 @property (nonatomic, copy) NSString *sectionFooterTitle; //该section的标题 -@property (nonatomic, strong) NSArray *cellViewModelsArray; //该section的数据源 +@property (nonatomic, strong) NSMutableArray *cellViewModelsArray; //该section的数据源 @property (nonatomic, assign) CGFloat sectionHeaderHeight; //header的高度 @property (nonatomic, assign) CGFloat sectionFooterHeight; //footer的高度 diff --git a/SJStaticTableViewDemo/SJStaticTableViewDemo/SJStaticTableViewComponent/SJStaticTableviewSectionViewModel.m b/SJStaticTableViewDemo/SJStaticTableViewDemo/SJStaticTableViewComponent/SJStaticTableviewSectionViewModel.m index e4adc34..2ab4a19 100644 --- a/SJStaticTableViewDemo/SJStaticTableViewDemo/SJStaticTableViewComponent/SJStaticTableviewSectionViewModel.m +++ b/SJStaticTableViewDemo/SJStaticTableViewDemo/SJStaticTableViewComponent/SJStaticTableviewSectionViewModel.m @@ -26,7 +26,7 @@ - (instancetype)initWithCellViewModelsArray:(NSArray *)cellViewModelsArray _indicatorLeftLabelTextColor = SJIndicatorLeftTitleTextColor; _indicatorLeftImageSize = CGSizeMake(SJImgWidth, SJImgWidth); _indicatorLeftImageAndLabelGap = SJRightMiddleGap; - _cellViewModelsArray = cellViewModelsArray; + _cellViewModelsArray = [cellViewModelsArray mutableCopy]; } return self; } diff --git a/SJStaticTableViewDemo/SJStaticTableViewDemo/ViewController/SJCustomCellsOneSectionViewController.m b/SJStaticTableViewDemo/SJStaticTableViewDemo/ViewController/SJCustomCellsOneSectionViewController.m index b24e3c0..0328a9e 100644 --- a/SJStaticTableViewDemo/SJStaticTableViewDemo/ViewController/SJCustomCellsOneSectionViewController.m +++ b/SJStaticTableViewDemo/SJStaticTableViewDemo/ViewController/SJCustomCellsOneSectionViewController.m @@ -17,7 +17,7 @@ @implementation SJCustomCellsOneSectionViewController - (void)viewDidLoad { [super viewDidLoad]; - self.navigationItem.title = @"定制cell页面 - 同组"; + self.navigationItem.title = @"定制cell页面 - 同组"; } diff --git a/SJStaticTableViewDemo/SJStaticTableViewDemo/ViewController/SJDiscoverViewController.m b/SJStaticTableViewDemo/SJStaticTableViewDemo/ViewController/SJDiscoverViewController.m index 197bd50..b933c28 100644 --- a/SJStaticTableViewDemo/SJStaticTableViewDemo/ViewController/SJDiscoverViewController.m +++ b/SJStaticTableViewDemo/SJStaticTableViewDemo/ViewController/SJDiscoverViewController.m @@ -18,6 +18,33 @@ - (void)viewDidLoad { [super viewDidLoad]; self.navigationItem.title = @"发现"; + + //模拟网络请求 + dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ + + //请求成功x + NSDictionary *responseDict = @{@"title_info":@"新游戏上架啦", + @"title_icon":@"game_1", + @"game_info":@"一起来玩斗地主呀!", + @"game_icon":@"doudizhu" + }; + //将要刷新cell的indexPath + NSIndexPath *indexPath = [NSIndexPath indexPathForRow:1 inSection:3]; + + //获取cell对应的viewModel + SJStaticTableviewCellViewModel *viewModel = [self.dataSource tableView:self.tableView cellViewModelAtIndexPath:indexPath]; + + if (viewModel) { + //更新viewModel + viewModel.leftTitle = responseDict[@"title_info"]; + viewModel.leftImage = [UIImage imageNamed:responseDict[@"title_icon"]]; + viewModel.indicatorLeftImage = [UIImage imageNamed:responseDict[@"game_icon"]]; + viewModel.indicatorLeftTitle = responseDict[@"game_info"]; + + //刷新tableview + [self.tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade]; + } + }); } diff --git a/SJStaticTableViewDemo/SJStaticTableViewDemo/ViewController/SJMeViewController.m b/SJStaticTableViewDemo/SJStaticTableViewDemo/ViewController/SJMeViewController.m index da8e986..1c139fd 100644 --- a/SJStaticTableViewDemo/SJStaticTableViewDemo/ViewController/SJMeViewController.m +++ b/SJStaticTableViewDemo/SJStaticTableViewDemo/ViewController/SJMeViewController.m @@ -21,7 +21,7 @@ @implementation SJMeViewController - (void)viewDidLoad { [super viewDidLoad]; - self.navigationItem.title = @"我"; + self.navigationItem.title = @"我"; } - (void)createDataSource diff --git a/SJStaticTableViewDemo/SJStaticTableViewDemo/ViewController/SJSettingViewController.m b/SJStaticTableViewDemo/SJStaticTableViewDemo/ViewController/SJSettingViewController.m index 66e1268..6c072dc 100644 --- a/SJStaticTableViewDemo/SJStaticTableViewDemo/ViewController/SJSettingViewController.m +++ b/SJStaticTableViewDemo/SJStaticTableViewDemo/ViewController/SJSettingViewController.m @@ -18,11 +18,11 @@ @interface SJSettingViewController () @implementation SJSettingViewController - (void)viewDidLoad { + [super viewDidLoad]; - self.navigationItem.title = @"设置"; + self.navigationItem.title = @"设置"; } - - (void)createDataSource { self.dataSource = [[SJStaticTableViewDataSource alloc] initWithViewModelsArray:[Factory settingPageData] configureBlock:^(SJStaticTableViewCell *cell, SJStaticTableviewCellViewModel *viewModel) {