增加选择房间 vc

This commit is contained in:
edwinQQQ
2025-05-12 18:53:42 +08:00
parent 2c5a1a289e
commit bd2e5e380f
8 changed files with 378 additions and 6 deletions

View File

@@ -496,6 +496,7 @@
4C1392A12D71675900A6DFB5 /* coincoin.mp4 in Resources */ = {isa = PBXBuildFile; fileRef = 4C1392A02D71675900A6DFB5 /* coincoin.mp4 */; };
4C1892992CF84349004D4426 /* RoomCahtCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C1892982CF84349004D4426 /* RoomCahtCell.m */; };
4C1A141B2DCB4AB700B6D0CA /* ChatFaceVo.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C1A141A2DCB4AB700B6D0CA /* ChatFaceVo.m */; };
4C3475C42DD1FE590099B984 /* CreateEventSelectRoomViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C3475C32DD1FE590099B984 /* CreateEventSelectRoomViewController.m */; };
4C38C2AD2D84064400CFA4A8 /* LoginInputItemView.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C38C2AC2D84064300CFA4A8 /* LoginInputItemView.m */; };
4C38C2B02D84070600CFA4A8 /* AccountBindingViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C38C2AF2D84070600CFA4A8 /* AccountBindingViewController.m */; };
4C44BD5D2D151B5C00F321FA /* RoomSideMenu.m in Sources */ = {isa = PBXBuildFile; fileRef = 4C44BD5C2D151B5C00F321FA /* RoomSideMenu.m */; };
@@ -2637,6 +2638,8 @@
4C1892982CF84349004D4426 /* RoomCahtCell.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = RoomCahtCell.m; sourceTree = "<group>"; };
4C1A14192DCB4AB700B6D0CA /* ChatFaceVo.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ChatFaceVo.h; sourceTree = "<group>"; };
4C1A141A2DCB4AB700B6D0CA /* ChatFaceVo.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = ChatFaceVo.m; sourceTree = "<group>"; };
4C3475C22DD1FE590099B984 /* CreateEventSelectRoomViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = CreateEventSelectRoomViewController.h; sourceTree = "<group>"; };
4C3475C32DD1FE590099B984 /* CreateEventSelectRoomViewController.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = CreateEventSelectRoomViewController.m; sourceTree = "<group>"; };
4C38C2AB2D84064300CFA4A8 /* LoginInputItemView.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = LoginInputItemView.h; sourceTree = "<group>"; };
4C38C2AC2D84064300CFA4A8 /* LoginInputItemView.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = LoginInputItemView.m; sourceTree = "<group>"; };
4C38C2AE2D84070600CFA4A8 /* AccountBindingViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AccountBindingViewController.h; sourceTree = "<group>"; };
@@ -10073,6 +10076,8 @@
4C85DB7D2DCDD70400FD9839 /* CreateEventViewController.m */,
4C85DB822DCDDD6800FD9839 /* CreateEventViewControllerV2.h */,
4C85DB832DCDDD6800FD9839 /* CreateEventViewControllerV2.m */,
4C3475C22DD1FE590099B984 /* CreateEventSelectRoomViewController.h */,
4C3475C32DD1FE590099B984 /* CreateEventSelectRoomViewController.m */,
);
path = View;
sourceTree = "<group>";
@@ -12877,6 +12882,7 @@
23FE47E42BB41EBF00F09D23 /* PINobleCenterListCell.m in Sources */,
E83DB4842746661800D8CBD1 /* XPRoomGiftBroadcastView.m in Sources */,
E8778AF82988F4E200CF139B /* XPSessionSayHelloHeaderView.m in Sources */,
4C3475C42DD1FE590099B984 /* CreateEventSelectRoomViewController.m in Sources */,
E84150C527747E0900A7F548 /* FirstRechargeRewardModel.m in Sources */,
E8B9843328ABA2FF0022D026 /* MonentsPicResInfo.m in Sources */,
239D0FDB2C047F24002977CE /* MSTabbarRoomGameCell.m in Sources */,

View File

@@ -0,0 +1,16 @@
//
// CreateEventSelectRoomViewController.h
// YuMi
//
// Created by P on 2025/5/12.
//
#import "MvpViewController.h"
NS_ASSUME_NONNULL_BEGIN
@interface CreateEventSelectRoomViewController : MvpViewController
@end
NS_ASSUME_NONNULL_END

View File

@@ -0,0 +1,261 @@
//
// CreateEventSelectRoomViewController.m
// YuMi
//
// Created by P on 2025/5/12.
//
#import "CreateEventSelectRoomViewController.h"
#import "CreateEventPresenter.h"
@interface CreateEventSelectRoomEmptyCell : UITableViewCell
+ (CGFloat)cellHeight;
+ (void)registerTo:(UITableView *)tableView;
+ (CreateEventSelectRoomEmptyCell *)cellFor:(UITableView *)tableView atIndexPath:(NSIndexPath *)indexPath;
@end
@implementation CreateEventSelectRoomEmptyCell
{
UILabel *titleLabel;
UIImageView *ufoImageView;
}
+ (CGFloat)cellHeight {
return 170;
}
+ (void)registerTo:(UITableView *)tableView {
[tableView registerClass:[self class]
forCellReuseIdentifier:NSStringFromClass([self class])];
}
+ (CreateEventSelectRoomEmptyCell *)cellFor:(UITableView *)tableView atIndexPath:(NSIndexPath *)indexPath {
return [tableView dequeueReusableCellWithIdentifier:NSStringFromClass([self class]) forIndexPath:indexPath];
}
- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
if (self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]) {
titleLabel = [UILabel labelInitWithText:YMLocalizedString(@"20.20.59_text_19")
font:kFontRegular(14)
textColor:UIColorFromRGB(0xafb1b3)];
ufoImageView = [[UIImageView alloc] initWithImage:kImage(@"common_empty_UFO")];
[self.contentView addSubview:ufoImageView];
[self.contentView addSubview:titleLabel];
[ufoImageView mas_makeConstraints:^(MASConstraintMaker *make) {
make.centerX.mas_equalTo(self.contentView);
make.top.mas_equalTo(16);
make.size.mas_equalTo(CGSizeMake(110, 110));
}];
[titleLabel mas_makeConstraints:^(MASConstraintMaker *make) {
make.centerX.mas_equalTo(self.contentView);
make.top.mas_equalTo(ufoImageView.mas_bottom).offset(16);
make.height.mas_equalTo(20);
}];
}
return self;
}
@end
@interface CreateEventSelectRoomCell : UITableViewCell
{
NetImageView *avatar;
UILabel *nameLabel;
UILabel *idLabel;
}
+ (CGFloat)cellHeight;
+ (void)registerTo:(UITableView *)tableView;
+ (CreateEventSelectRoomCell *)cellFor:(UITableView *)tableView atIndexPath:(NSIndexPath *)indexPath;
@end
@implementation CreateEventSelectRoomCell
+ (CGFloat)cellHeight {
return 78;
}
+ (void)registerTo:(UITableView *)tableView {
[tableView registerClass:[self class]
forCellReuseIdentifier:NSStringFromClass([self class])];
}
+ (CreateEventSelectRoomCell *)cellFor:(UITableView *)tableView atIndexPath:(NSIndexPath *)indexPath {
return [tableView dequeueReusableCellWithIdentifier:NSStringFromClass([self class]) forIndexPath:indexPath];
}
- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
if (self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]) {
NetImageConfig * config = [[NetImageConfig alloc] init];
config.placeHolder = [UIImageConstant defaultAvatarPlaceholder];
config.imageType = ImageTypeUserIcon;
avatar = [[NetImageView alloc]initWithConfig:config];
[avatar setCornerRadius:8];
[self.contentView addSubview: avatar];
nameLabel = [UILabel labelInitWithText:@"123" font:kFontSemibold(15) textColor:UIColorFromRGB(0x313131)];
[self.contentView addSubview:nameLabel];
idLabel = [UILabel labelInitWithText:@"456" font:kFontRegular(13) textColor:UIColorFromRGB(0x7b7b7d)];
[self.contentView addSubview:idLabel];
[avatar mas_makeConstraints:^(MASConstraintMaker *make) {
make.centerY.mas_equalTo(self.contentView);
make.leading.mas_equalTo(16);
make.size.mas_equalTo(CGSizeMake(48, 48));
}];
[nameLabel mas_makeConstraints:^(MASConstraintMaker *make) {
make.top.mas_equalTo(avatar).offset(4);
make.leading.mas_equalTo(avatar).offset(11);
make.height.mas_equalTo(21);
}];
[idLabel mas_makeConstraints:^(MASConstraintMaker *make) {
make.bottom.mas_equalTo(avatar).offset(-4);
make.leading.mas_equalTo(avatar).offset(11);
make.height.mas_equalTo(18);
}];
}
return self;
}
@end
@interface CreateEventSelectRoomViewController () <UITableViewDelegate, UITableViewDataSource>
{
UITableView *tableView;
}
@property (nonatomic, strong) NSMutableArray *myRooms;
@property (nonatomic, strong) NSMutableArray *adminRooms;
@end
@implementation CreateEventSelectRoomViewController
- (__kindof id)presenter {
return [CreateEventPresenter new];
}
- (void)viewDidLoad {
[super viewDidLoad];
self.title = YMLocalizedString(@"20.20.59_text_14");
self.myRooms = [NSMutableArray array];
self.adminRooms = [NSMutableArray array];
[self setupUI];
}
- (void)setupUI {
tableView = [[UITableView alloc] initWithFrame:self.view.bounds style:UITableViewStylePlain];
tableView.delegate = self;
tableView.dataSource = self;
tableView.separatorInset = UIEdgeInsetsZero;
tableView.backgroundColor = [UIColor whiteColor];
[CreateEventSelectRoomCell registerTo:tableView];
[CreateEventSelectRoomEmptyCell registerTo:tableView];
[self.view addSubview:tableView];
}
#pragma mark - Delegate & DataSource
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return 2;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
switch (section) {
case 0:
return self.myRooms.count == 0 ? 1 : self.myRooms.count;
break;
case 1:
return self.adminRooms.count == 0 ? 1 : self.adminRooms.count;
break;
default:
return 0;
break;
}
}
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
switch (section) {
case 0: {
return [self sectionHeaderTitle:YMLocalizedString(@"20.20.59_text_20")];
}
break;
case 1: {
return [self sectionHeaderTitle:YMLocalizedString(@"20.20.59_text_21")];
}
break;
default:
return [UIView new];
break;
}
}
- (CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {
return 30;
}
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
switch (indexPath.section) {
case 0: {
return self.myRooms.count == 0 ? [CreateEventSelectRoomEmptyCell cellHeight] : [CreateEventSelectRoomCell cellHeight];
}
break;
case 1: {
return self.adminRooms.count == 0 ? [CreateEventSelectRoomEmptyCell cellHeight] : [CreateEventSelectRoomCell cellHeight];
}
break;
default:
return 0;
break;
}
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
UITableViewCell *cell = [UITableViewCell new];
switch (indexPath.section) {
case 0: {
if (self.myRooms.count == 0) {
cell = [CreateEventSelectRoomEmptyCell cellFor:tableView atIndexPath:indexPath];
} else {
cell = [CreateEventSelectRoomCell cellFor:tableView atIndexPath:indexPath];
}
}
break;
case 1: {
if (self.adminRooms.count == 0) {
cell = [CreateEventSelectRoomEmptyCell cellFor:tableView atIndexPath:indexPath];
} else {
cell = [CreateEventSelectRoomCell cellFor:tableView atIndexPath:indexPath];
}
}
break;
default: {
cell = [UITableViewCell new];
}
break;
}
return cell;
}
#pragma mark -
- (UIView *)sectionHeaderTitle:(NSString *)title {
UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, KScreenWidth, 30)];
view.backgroundColor = UIColorFromRGB(0xf2f3f7);
UILabel *label = [UILabel labelInitWithText:title font:kFontSemibold(14) textColor:UIColorFromRGB(0x313131)];
[view addSubview:label];
[label mas_makeConstraints:^(MASConstraintMaker *make) {
make.centerY.mas_equalTo(view);
make.leading.mas_equalTo(16);
}];
return view;
}
@end

View File

@@ -9,11 +9,15 @@
#import <Masonry/Masonry.h>
#import <PhotosUI/PhotosUI.h>
#import "CreateEventSelectRoomViewController.h"
#define MAX_EVENT_TITLE_LENGTH 20
#define MAX_EVENT_CONTENT_LENGTH 100
@interface CreateEventViewControllerV2 () <UITextViewDelegate, UITextFieldDelegate, UIImagePickerControllerDelegate, UINavigationControllerDelegate, PHPickerViewControllerDelegate, UIPickerViewDataSource, UIPickerViewDelegate>
@interface CreateEventViewControllerV2 () <UITextViewDelegate, UITextFieldDelegate, UIImagePickerControllerDelegate, UINavigationControllerDelegate, PHPickerViewControllerDelegate, UIPickerViewDataSource, UIPickerViewDelegate, UIScrollViewDelegate>
@property (nonatomic, strong) UIImage *selectedImage;
//
- (UIButton *)createUploadBannerButtonWithTitle:(NSString *)title imageName:(NSString *)imageName selectedImageName:(NSString *)selectedImageName tag:(NSInteger)tag;
- (void)setupDatePicker; //
@@ -49,6 +53,43 @@ static const CGFloat kSectionSpacing = 20.0;
self.selectedDurationInMinutes = 120; // Default to 2 hours
[self updateDurationLabel];
//
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillHide:) name:UIKeyboardWillHideNotification object:nil];
//
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(dismissKeyboard)];
tap.cancelsTouchesInView = NO;
[self.view addGestureRecognizer:tap];
// scrollView delegate
self.scrollView.delegate = self;
}
- (void)dealloc {
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
- (void)keyboardWillShow:(NSNotification *)notification {
NSDictionary *userInfo = notification.userInfo;
CGRect keyboardFrame = [userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue];
CGFloat keyboardHeight = keyboardFrame.size.height;
UIEdgeInsets insets = self.scrollView.contentInset;
insets.bottom = keyboardHeight + 20;
self.scrollView.contentInset = insets;
self.scrollView.scrollIndicatorInsets = insets;
}
- (void)keyboardWillHide:(NSNotification *)notification {
UIEdgeInsets insets = self.scrollView.contentInset;
insets.bottom = 0;
self.scrollView.contentInset = insets;
self.scrollView.scrollIndicatorInsets = insets;
}
- (void)dismissKeyboard {
[self.view endEditing:YES];
}
- (void)backButtonTapped {
@@ -227,19 +268,26 @@ static const CGFloat kSectionSpacing = 20.0;
- (void)selectRoomTapped {
NSLog(@"Select Room Tapped");
CreateEventSelectRoomViewController *vc = [[CreateEventSelectRoomViewController alloc] init];
[self.navigationController pushViewController:vc animated:YES];
// Placeholder: Show a room selection UI (e.g., UIPickerView or new VC)
// For now, just update the label
self.selectRoomPlaceholderLabel.text = @"Room A";
self.selectRoomPlaceholderLabel.textColor = [UIColor blackColor];
// self.selectRoomPlaceholderLabel.text = @"Room A";
// self.selectRoomPlaceholderLabel.textColor = [UIColor blackColor];
// [self checkCreateEventButtonState];
}
- (void)selectStartTimeTapped {
NSLog(@"Select Start Time Tapped");
// Placeholder: Show a date picker
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
formatter.dateFormat = @"yyyy-MM-dd HH:mm";
self.startTimePlaceholderLabel.text = [formatter stringFromDate:[NSDate date]];
self.startTimePlaceholderLabel.textColor = [UIColor blackColor];
[self checkCreateEventButtonState];
}
- (void)selectDurationTapped {
@@ -249,6 +297,7 @@ static const CGFloat kSectionSpacing = 20.0;
// self.durationPlaceholderLabel.textColor = [UIColor blackColor];
self.datePickerContainerView.hidden = NO;
[self checkCreateEventButtonState];
}
- (void)createEventButtonTapped {
@@ -294,6 +343,7 @@ static const CGFloat kSectionSpacing = 20.0;
- (void)textFieldDidChangeSelection:(UITextField *)textField {
if (textField == self.eventTitleTextField) {
[self updateEventTitleCharCount];
[self checkCreateEventButtonState];
}
}
@@ -302,6 +352,7 @@ static const CGFloat kSectionSpacing = 20.0;
- (void)textViewDidChange:(UITextView *)textView {
if (textView == self.eventContentTextView) {
[self updateEventContentCharCount];
[self checkCreateEventButtonState];
// Optional: Add placeholder behavior for UITextView if needed
}
}
@@ -330,6 +381,7 @@ static const CGFloat kSectionSpacing = 20.0;
// : self.shouldUploadBanner = NO;
}
}
[self checkCreateEventButtonState];
}
#pragma mark - UIImagePickerControllerDelegate (Legacy)
@@ -337,10 +389,12 @@ static const CGFloat kSectionSpacing = 20.0;
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<UIImagePickerControllerInfoKey,id> *)info {
UIImage *selectedImage = info[UIImagePickerControllerOriginalImage];
if (selectedImage) {
self.selectedImage = selectedImage;
self.eventBannerImageView.image = selectedImage;
self.eventBannerCamearImageView.hidden = NO; // Hide placeholder once image is selected
}
[picker dismissViewControllerAnimated:YES completion:nil];
[self checkCreateEventButtonState];
}
- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker {
@@ -352,19 +406,27 @@ static const CGFloat kSectionSpacing = 20.0;
- (void)picker:(PHPickerViewController *)picker didFinishPicking:(NSArray<PHPickerResult *> *)results API_AVAILABLE(ios(14)) {
[picker dismissViewControllerAnimated:YES completion:nil];
if (results.count == 0) {
[self checkCreateEventButtonState];
return;
}
PHPickerResult *result = results.firstObject;
if ([result.itemProvider canLoadObjectOfClass:[UIImage class]]) {
[result.itemProvider loadObjectOfClass:[UIImage class] completionHandler:^(__kindof id<NSItemProviderReading> _Nullable object, NSError * _Nullable error) {
if ([object isKindOfClass:[UIImage class]]) {
dispatch_async(dispatch_get_main_queue(), ^{
self.selectedImage = (UIImage *)object;
self.eventBannerImageView.image = (UIImage *)object;
self.eventBannerCamearImageView.hidden = NO; // Hide placeholder
[self checkCreateEventButtonState];
});
} else {
dispatch_async(dispatch_get_main_queue(), ^{
[self checkCreateEventButtonState];
});
}
}];
} else {
[self checkCreateEventButtonState];
}
}
@@ -706,4 +768,26 @@ static const CGFloat kSectionSpacing = 20.0;
}];
}
#pragma mark - UIScrollViewDelegate
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView {
[self dismissKeyboard];
}
- (void)checkCreateEventButtonState {
NSString *placeholder = YMLocalizedString(@"XPAnchorPKTableViewCell2");
BOOL hasTitle = self.eventTitleTextField.text.length > 0;
BOOL hasBanner = self.selectedImage != nil;
BOOL hasRoom = self.selectRoomPlaceholderLabel.text.length > 0 && ![self.selectRoomPlaceholderLabel.text isEqualToString:placeholder];
BOOL hasStartTime = self.startTimePlaceholderLabel.text.length > 0 && ![self.startTimePlaceholderLabel.text isEqualToString:placeholder];
BOOL hasDuration = self.durationPlaceholderLabel.text.length > 0 && ![self.durationPlaceholderLabel.text isEqualToString:placeholder];
BOOL hasContent = self.eventContentTextView.text.length > 0;
if (hasTitle && hasBanner && hasRoom && hasStartTime && hasDuration && hasContent) {
self.createEventButton.alpha = 1.0;
self.createEventButton.userInteractionEnabled = YES;
} else {
self.createEventButton.alpha = 0.3;
self.createEventButton.userInteractionEnabled = NO;
}
}
@end

View File

@@ -4187,3 +4187,4 @@ ineHeadView12" = "الحمل";
"20.20.59_text_16" = "Duration";
"20.20.59_text_17" = "Event Content";
"20.20.59_text_18" = "Notify My Fans";
"20.20.59_text_19" = "No rooms available~";

View File

@@ -3972,4 +3972,4 @@
"20.20.59_text_16" = "Duration";
"20.20.59_text_17" = "Event Content";
"20.20.59_text_18" = "Notify My Fans";
"20.20.59_text_19" = "No rooms available~";

View File

@@ -3765,3 +3765,4 @@
"20.20.59_text_16" = "Duration";
"20.20.59_text_17" = "Event Content";
"20.20.59_text_18" = "Notify My Fans";
"20.20.59_text_19" = "No rooms available~";

View File

@@ -3637,3 +3637,6 @@
"20.20.59_text_16" = "Duration";
"20.20.59_text_17" = "Event Content";
"20.20.59_text_18" = "Notify My Fans";
"20.20.59_text_19" = "No rooms available~";
"20.20.59_text_20" = "My Rooms";
"20.20.59_text_21" = "Admin Rooms";