更新事件中心模块,新增 HomeBannerInfoModel 相关功能,优化事件列表数据处理,调整时间选择器逻辑,修复部分 UI 问题,更新本地化字符串。版本号更新至20.20.64。
This commit is contained in:
1
.vscode/settings.json
vendored
1
.vscode/settings.json
vendored
@@ -10,6 +10,7 @@
|
||||
"autoreleasepool",
|
||||
"Autoresizing",
|
||||
"Bugly",
|
||||
"Commont",
|
||||
"MSRTL",
|
||||
"NIMSDK",
|
||||
"Nonnull",
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
#import "EventRoomModel.h"
|
||||
#import "EventConfigModel.h"
|
||||
#import "WalletInfoModel.h"
|
||||
|
||||
#import "HomeBannerInfoModel.h"
|
||||
NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
@protocol CreateEventPresenterProcotol <NSObject>
|
||||
@@ -41,7 +41,7 @@ NS_ASSUME_NONNULL_BEGIN
|
||||
- (void)deleteEventSuccess:(NSInteger)eventId;
|
||||
- (void)deleteEventFailure:(NSString *)msg;
|
||||
|
||||
- (void)officialEventListSuccess:(EventRoomListModel *)listModel;
|
||||
- (void)officialEventListSuccess:(NSArray <HomeBannerInfoModel *> *)listModel;
|
||||
- (void)officialEventListFailure:(NSString *)msg;
|
||||
|
||||
|
||||
|
||||
@@ -30,10 +30,9 @@
|
||||
}
|
||||
|
||||
- (void)loadOfficialEvents {
|
||||
// TODO: 补充官方活动数据 / 调整创建活动时,选择开始时间的 bug
|
||||
[Api homeBanner:[self createHttpCompletion:^(BaseModel * _Nonnull data) {
|
||||
if ([[self getView] respondsToSelector:@selector(officialEventListSuccess:)]) {
|
||||
[[self getView] officialEventListSuccess:[EventConfigModel modelWithJSON:data.data]];
|
||||
[[self getView] officialEventListSuccess:[HomeBannerInfoModel modelsWithArray:data.data]];
|
||||
}
|
||||
} fail:^(NSInteger code, NSString * _Nullable msg) {
|
||||
if ([[self getView] respondsToSelector:@selector(officialEventListFailure:)]) {
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
@property (nonatomic, strong) NSDate *selectedDate;
|
||||
// StartTime 相关
|
||||
@property (nonatomic, strong) NSArray<NSDictionary *> *durationsOptions;
|
||||
@property (nonatomic, strong) NSDate *defaultSelectedDate;
|
||||
@end
|
||||
|
||||
@implementation CreateEventPickerContainerView {
|
||||
@@ -187,7 +188,6 @@
|
||||
|
||||
NSMutableArray *months = [NSMutableArray array];
|
||||
NSMutableArray *days = [NSMutableArray array];
|
||||
NSMutableArray *hours = [NSMutableArray array];
|
||||
|
||||
NSDate *iter = start;
|
||||
while ([iter compare:end] != NSOrderedDescending) {
|
||||
@@ -195,21 +195,64 @@
|
||||
|
||||
NSString *monthStr = [NSString stringWithFormat:@"%02ld", (long)c.month];
|
||||
NSString *dayStr = [NSString stringWithFormat:@"%02ld", (long)c.day];
|
||||
NSString *hourStr = [NSString stringWithFormat:@"%02ld:00", (long)c.hour];
|
||||
|
||||
if (![months containsObject:monthStr]) [months addObject:monthStr];
|
||||
if (![days containsObject:dayStr]) [days addObject:dayStr];
|
||||
if (![hours containsObject:hourStr]) [hours addObject:hourStr];
|
||||
|
||||
iter = [calendar dateByAddingUnit:NSCalendarUnitHour value:1 toDate:iter options:0];
|
||||
iter = [calendar dateByAddingUnit:NSCalendarUnitDay value:1 toDate:iter options:0];
|
||||
}
|
||||
|
||||
self.monthArray = months;
|
||||
self.dayArray = days;
|
||||
self.hourArray = hours;
|
||||
|
||||
// 设置初始选中的月和日
|
||||
NSDateComponents *startComp = [calendar components:NSCalendarUnitMonth|NSCalendarUnitDay|NSCalendarUnitHour fromDate:start];
|
||||
NSInteger initialMonthIndex = [months indexOfObject:[NSString stringWithFormat:@"%02ld", (long)startComp.month]];
|
||||
NSInteger initialDayIndex = [days indexOfObject:[NSString stringWithFormat:@"%02ld", (long)startComp.day]];
|
||||
|
||||
// 根据是否是明天来生成小时数组
|
||||
[self updateHourArrayForDate:start];
|
||||
|
||||
// 设置选中的初始值
|
||||
dispatch_async(dispatch_get_main_queue(), ^{
|
||||
[self.pickerView selectRow:initialMonthIndex inComponent:0 animated:NO];
|
||||
[self.pickerView selectRow:initialDayIndex inComponent:1 animated:NO];
|
||||
[self.pickerView selectRow:0 inComponent:2 animated:NO];
|
||||
});
|
||||
|
||||
self.selectedDate = start;
|
||||
}
|
||||
|
||||
- (void)updateHourArrayForDate:(NSDate *)date {
|
||||
NSCalendar *calendar = [NSCalendar currentCalendar];
|
||||
NSDate *now = [NSDate date];
|
||||
|
||||
// 判断选中的日期是否是明天
|
||||
NSDateComponents *dateComp = [calendar components:NSCalendarUnitYear|NSCalendarUnitMonth|NSCalendarUnitDay fromDate:date];
|
||||
NSDateComponents *tomorrowComp = [calendar components:NSCalendarUnitYear|NSCalendarUnitMonth|NSCalendarUnitDay fromDate:[calendar dateByAddingUnit:NSCalendarUnitDay value:1 toDate:now options:0]];
|
||||
|
||||
BOOL isTomorrow = dateComp.year == tomorrowComp.year &&
|
||||
dateComp.month == tomorrowComp.month &&
|
||||
dateComp.day == tomorrowComp.day;
|
||||
|
||||
NSMutableArray *hours = [NSMutableArray array];
|
||||
|
||||
if (isTomorrow) {
|
||||
// 如果是明天,从当前小时开始
|
||||
NSInteger currentHour = [[calendar components:NSCalendarUnitHour fromDate:now] hour];
|
||||
for (NSInteger i = currentHour; i <= 23; i++) {
|
||||
[hours addObject:[NSString stringWithFormat:@"%02ld:00", (long)i]];
|
||||
}
|
||||
} else {
|
||||
// 如果不是明天,显示全部小时
|
||||
for (NSInteger i = 0; i <= 23; i++) {
|
||||
[hours addObject:[NSString stringWithFormat:@"%02ld:00", (long)i]];
|
||||
}
|
||||
}
|
||||
|
||||
self.hourArray = hours;
|
||||
}
|
||||
|
||||
- (void)showInView:(UIView *)parentView
|
||||
initialDate:(NSDate *)date
|
||||
config:(EventConfigModel *)config
|
||||
@@ -223,6 +266,28 @@
|
||||
if (type == CreateEventPickerTypeStartTime) {
|
||||
[self buildStartTimeSourceWithInitialDate:date];
|
||||
_titleLabel.text = YMLocalizedString(@"20.20.59_text_15");
|
||||
|
||||
// 保存默认选中的日期
|
||||
NSCalendar *calendar = [NSCalendar currentCalendar];
|
||||
NSInteger monthIdx = [self.pickerView selectedRowInComponent:0];
|
||||
NSInteger dayIdx = [self.pickerView selectedRowInComponent:1];
|
||||
NSInteger hourIdx = [self.pickerView selectedRowInComponent:2];
|
||||
|
||||
NSDateComponents *nowComp = [calendar components:NSCalendarUnitYear fromDate:[NSDate date]];
|
||||
NSInteger year = nowComp.year;
|
||||
NSInteger month = [self.monthArray[monthIdx] integerValue];
|
||||
NSInteger day = [self.dayArray[dayIdx] integerValue];
|
||||
NSInteger hour = [[self.hourArray[hourIdx] substringToIndex:2] integerValue];
|
||||
|
||||
NSDateComponents *selComp = [[NSDateComponents alloc] init];
|
||||
selComp.year = year;
|
||||
selComp.month = month;
|
||||
selComp.day = day;
|
||||
selComp.hour = hour;
|
||||
selComp.minute = 0;
|
||||
self.defaultSelectedDate = [calendar dateFromComponents:selComp];
|
||||
self.selectedDate = self.defaultSelectedDate;
|
||||
|
||||
} else if (type == CreateEventPickerTypeDuration) {
|
||||
[self buildDurationDataSource];
|
||||
_titleLabel.text = YMLocalizedString(@"20.20.59_text_16");
|
||||
@@ -270,19 +335,34 @@
|
||||
case CreateEventPickerTypeStartTime: {
|
||||
NSInteger monthIdx = [pickerView selectedRowInComponent:0];
|
||||
NSInteger dayIdx = [pickerView selectedRowInComponent:1];
|
||||
NSInteger hourIdx = [pickerView selectedRowInComponent:2];
|
||||
|
||||
NSCalendar *calendar = [NSCalendar currentCalendar];
|
||||
NSDateComponents *nowComp = [calendar components:NSCalendarUnitYear fromDate:[NSDate date]];
|
||||
NSInteger year = nowComp.year;
|
||||
NSInteger month = [self.monthArray[monthIdx] integerValue];
|
||||
NSInteger day = [self.dayArray[dayIdx] integerValue];
|
||||
NSInteger hour = [[self.hourArray[hourIdx] substringToIndex:2] integerValue];
|
||||
|
||||
// 创建选中的日期
|
||||
NSDateComponents *selComp = [[NSDateComponents alloc] init];
|
||||
selComp.year = year;
|
||||
selComp.month = month;
|
||||
selComp.day = day;
|
||||
selComp.hour = hour;
|
||||
selComp.hour = 0;
|
||||
selComp.minute = 0;
|
||||
NSDate *selectedDate = [calendar dateFromComponents:selComp];
|
||||
|
||||
// 更新小时数组
|
||||
if (component < 2) { // 只有在月份或日期改变时才更新小时
|
||||
[self updateHourArrayForDate:selectedDate];
|
||||
[pickerView reloadComponent:2];
|
||||
[pickerView selectRow:0 inComponent:2 animated:YES];
|
||||
}
|
||||
|
||||
// 获取当前选中的小时
|
||||
NSInteger hourIdx = [pickerView selectedRowInComponent:2];
|
||||
NSInteger hour = [[self.hourArray[hourIdx] substringToIndex:2] integerValue];
|
||||
selComp.hour = hour;
|
||||
|
||||
self.selectedDate = [calendar dateFromComponents:selComp];
|
||||
}
|
||||
break;
|
||||
@@ -346,19 +426,23 @@
|
||||
case CreateEventPickerTypeStartTime: {
|
||||
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
|
||||
formatter.dateFormat = @"yyyy-MM-dd HH:mm:ss";
|
||||
resultString = [formatter stringFromDate:self.selectedDate];
|
||||
|
||||
// 使用默认选中日期或用户选择的日期
|
||||
NSDate *dateToUse = self.selectedDate ?: self.defaultSelectedDate;
|
||||
resultString = [formatter stringFromDate:dateToUse];
|
||||
self.onConfirmDate(dateToUse, resultString, durationMinutes);
|
||||
}
|
||||
break;
|
||||
case CreateEventPickerTypeDuration: {
|
||||
NSInteger selectedRow = [self.pickerView selectedRowInComponent:0];
|
||||
resultString = self.durationsOptions[selectedRow][@"title"];
|
||||
durationMinutes = [self.durationsOptions[selectedRow][@"minutes"] integerValue];
|
||||
self.onConfirmDate(self.selectedDate, resultString, durationMinutes);
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
self.onConfirmDate(self.selectedDate, resultString, durationMinutes);
|
||||
}
|
||||
[self dismiss];
|
||||
}
|
||||
|
||||
@@ -180,7 +180,10 @@ static const CGFloat kSectionSpacing = 20.0;
|
||||
|
||||
- (void)createEventSuccess {
|
||||
[XNDJTDDLoadingTool showSuccessWithMessage:YMLocalizedString(@"20.20.59_text_34")];
|
||||
[self.navigationController popViewControllerAnimated:NO];
|
||||
[self.navigationController popViewControllerAnimated:YES];
|
||||
if (self.createSuccess) {
|
||||
self.createSuccess();
|
||||
}
|
||||
}
|
||||
|
||||
- (void)createEventFailure:(NSString *)msg {
|
||||
|
||||
@@ -11,7 +11,7 @@ NS_ASSUME_NONNULL_BEGIN
|
||||
|
||||
@interface EventCenterViewController : MvpViewController
|
||||
|
||||
@property (nonatomic,copy) NSArray<HomeBannerInfoModel *> *officialEventModels;
|
||||
|
||||
|
||||
@end
|
||||
|
||||
|
||||
@@ -32,6 +32,7 @@ static UIEdgeInsets kOfficialTableViewContentInset(void) {
|
||||
|
||||
@interface EventCenterViewController () <UIPageViewControllerDataSource, UIPageViewControllerDelegate, UITableViewDelegate, UITableViewDataSource, CreateEventPresenterProcotol>
|
||||
|
||||
|
||||
@property (nonatomic, strong) NSMutableArray <HomeBannerInfoModel *>*officialDatasource;
|
||||
@property (nonatomic, strong) NSMutableArray <EventItemModel *>*eventSquareDatasource;
|
||||
@property (nonatomic, strong) NSMutableArray *myCreateEventDatasource;
|
||||
@@ -72,7 +73,8 @@ static UIEdgeInsets kOfficialTableViewContentInset(void) {
|
||||
[self setupBottomButton];
|
||||
|
||||
// 设置初始状态下 createButton 的显示状态
|
||||
self.createButton.hidden = (self.currentIndex == 0);
|
||||
self.createButton.hidden = YES;
|
||||
[self.presenter loadOfficialEvents];
|
||||
}
|
||||
|
||||
#pragma mark - Setup UI
|
||||
@@ -177,8 +179,8 @@ static UIEdgeInsets kOfficialTableViewContentInset(void) {
|
||||
}
|
||||
|
||||
#pragma mark - Setup Data
|
||||
- (void)setOfficialEventModels:(NSArray<HomeBannerInfoModel *> *)officialEventModels {
|
||||
_officialDatasource = officialEventModels.mutableCopy;
|
||||
- (void)setOfficialDatasource:(NSMutableArray<HomeBannerInfoModel *> *)officialDatasource {
|
||||
_officialDatasource = officialDatasource;
|
||||
//#if DEBUG
|
||||
//#else
|
||||
// NSPredicate *predicate = [NSPredicate predicateWithFormat:@"activityShow == %@", @(1)];
|
||||
@@ -187,7 +189,7 @@ static UIEdgeInsets kOfficialTableViewContentInset(void) {
|
||||
|
||||
// 处理空数据状态
|
||||
if (_officialDatasource.count == 0) {
|
||||
self.officialTableView.mj_header.hidden = YES;
|
||||
self.officialTableView.mj_header.hidden = NO;
|
||||
self.officialTableView.mj_footer.hidden = YES;
|
||||
} else {
|
||||
self.officialTableView.mj_header.hidden = NO;
|
||||
@@ -205,7 +207,7 @@ static UIEdgeInsets kOfficialTableViewContentInset(void) {
|
||||
|
||||
- (void)switchToIndex:(NSInteger)index animated:(BOOL)animated {
|
||||
if (index == self.currentIndex) return;
|
||||
|
||||
|
||||
// 更新按钮状态
|
||||
self.tabButtons[self.currentIndex].selected = NO;
|
||||
self.tabButtons[index].selected = YES;
|
||||
@@ -238,10 +240,25 @@ static UIEdgeInsets kOfficialTableViewContentInset(void) {
|
||||
self.createButton.hidden = (index == 0);
|
||||
|
||||
// 加载数据逻辑
|
||||
if (index == 1 && self.eventSquareDatasource.count == 0) {
|
||||
[self.presenter loadEventSquare:self.eventSquareTableViewPage];
|
||||
} else if (index == 2 && self.myCreateEventDatasource.count == 0 && self.mySubEventDatasource.count == 0) {
|
||||
[self.presenter loadMyEvents];
|
||||
switch (index) {
|
||||
case 0:
|
||||
if (self.officialDatasource.count == 0) {
|
||||
[self.presenter loadOfficialEvents];
|
||||
}
|
||||
break;
|
||||
case 1:
|
||||
if (self.eventSquareDatasource.count == 0) {
|
||||
[self.presenter loadEventSquare:self.eventSquareTableViewPage];
|
||||
}
|
||||
break;
|
||||
case 2:
|
||||
if (self.myCreateEventDatasource.count == 0 && self.mySubEventDatasource.count == 0) {
|
||||
[self.presenter loadMyEvents];
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -252,17 +269,9 @@ static UIEdgeInsets kOfficialTableViewContentInset(void) {
|
||||
@kWeakify(self);
|
||||
[createEventVC setCreateSuccess:^{
|
||||
@kStrongify(self);
|
||||
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
|
||||
switch (self.currentIndex) {
|
||||
case 1:
|
||||
[self.eventSquareTableView.mj_header beginRefreshing];
|
||||
break;
|
||||
case 2:
|
||||
[self.myEventTableView.mj_header beginRefreshing];
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
|
||||
[self.eventSquareTableView.mj_header beginRefreshing];
|
||||
[self.myEventTableView.mj_header beginRefreshing];
|
||||
});
|
||||
}];
|
||||
}
|
||||
@@ -367,8 +376,11 @@ static UIEdgeInsets kOfficialTableViewContentInset(void) {
|
||||
@kWeakify(self);
|
||||
if (tableView == self.officialTableView) {
|
||||
if (self.officialDatasource.count == 0) {
|
||||
// EventCenterEmptyCell *cell =
|
||||
return [EventCenterEmptyCell cellFor:tableView customID:kOfficialEmptyID atIndexPath:indexPath];
|
||||
EventCenterEmptyCell *cell = [EventCenterEmptyCell cellFor:tableView customID:kOfficialEmptyID atIndexPath:indexPath];
|
||||
// 设置空状态的提示文本
|
||||
// [cell updateWithTitle:YMLocalizedString(@"20.20.59_text_37")
|
||||
// subTitle:msg];
|
||||
return cell;
|
||||
}
|
||||
|
||||
EventCenterOfficialCell *cell = [tableView dequeueReusableCellWithIdentifier:NSStringFromClass([EventCenterOfficialCell class])];
|
||||
@@ -553,6 +565,17 @@ static UIEdgeInsets kOfficialTableViewContentInset(void) {
|
||||
|
||||
#pragma mark - CreateEventPresenterProcotol
|
||||
|
||||
- (void)officialEventListSuccess:(NSArray <HomeBannerInfoModel *> *)listModels {
|
||||
[self setOfficialDatasource:listModels.mutableCopy];
|
||||
[self.officialTableView.mj_header endRefreshing];
|
||||
}
|
||||
|
||||
- (void)officialEventListFailure:(NSString *)msg {
|
||||
[self.officialTableView.mj_header endRefreshing];
|
||||
// 清空数据源并刷新表格,触发显示空状态
|
||||
[self setOfficialDatasource:[NSMutableArray array]];
|
||||
}
|
||||
|
||||
- (void)eventSquareListSuccess:(NSArray <EventItemModel *>*)list {
|
||||
if (self.eventSquareTableViewPage == 1) {
|
||||
[self.eventSquareDatasource removeAllObjects];
|
||||
@@ -638,6 +661,7 @@ static UIEdgeInsets kOfficialTableViewContentInset(void) {
|
||||
}
|
||||
}
|
||||
[self.eventSquareTableView reloadData];
|
||||
[self.myEventTableView.mj_header beginRefreshing];
|
||||
break;
|
||||
case 2:
|
||||
for (EventItemModel *m in self.mySubEventDatasource) {
|
||||
@@ -655,6 +679,7 @@ static UIEdgeInsets kOfficialTableViewContentInset(void) {
|
||||
}
|
||||
}
|
||||
[self.myEventTableView reloadData];
|
||||
[self.eventSquareTableView.mj_header beginRefreshing];
|
||||
break;
|
||||
|
||||
default:
|
||||
@@ -702,6 +727,12 @@ static UIEdgeInsets kOfficialTableViewContentInset(void) {
|
||||
_officialTableView.contentInset = kOfficialTableViewContentInset();
|
||||
_officialTableView.scrollIndicatorInsets = kOfficialTableViewContentInset();
|
||||
[EventCenterEmptyCell registerTo:_officialTableView withCustomID:kOfficialEmptyID];
|
||||
|
||||
// 添加下拉刷新
|
||||
__weak typeof(self) weakSelf = self;
|
||||
_officialTableView.mj_header = [MJRefreshNormalHeader headerWithRefreshingBlock:^{
|
||||
[weakSelf.presenter loadOfficialEvents];
|
||||
}];
|
||||
}
|
||||
return _officialTableView;
|
||||
}
|
||||
|
||||
@@ -797,7 +797,6 @@ XPHomeRecommendOtherRoomViewDelegate>
|
||||
case 1: {
|
||||
EventCenterViewController *vc = [[EventCenterViewController alloc] init];
|
||||
[self.navigationController pushViewController:vc animated:YES];
|
||||
vc.officialEventModels = self.headView.bannerList;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
|
||||
@@ -17,3 +17,4 @@ int main(int argc, char * argv[]) {
|
||||
|
||||
return UIApplicationMain(argc, argv, nil, appDelegateClassName);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user