| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632 |
- //
- // MerchantEnrollViewController.m
- // BuguLive
- //
- // Created by qitewei on 2025/8/11.
- // Copyright © 2025 xfg. All rights reserved.
- //
- #import "MerchantEnrollViewController.h"
- #import "MerchantEnrollGuideView.h"
- #import "MerchantEnrollCheckListView.h"
- #import "MerchantStoreInfoView.h"
- #import "MerchantBusinessLicenseView.h"
- #import "MerchantLegalInfoView.h"
- #import "MerchantBankInfoView.h"
- #import "MerchantAdminSetupView.h"
- #import "MerchantPaymentView.h"
- #import "MerchantEnrollResultView.h"
- #import "NavigationBarView.h"
- #import "MerchantBaseEnrollContentView.h"
- #import "UIButton+Layout.h"
- #import "MerchantEnrollDataManager.h"
- @interface MerchantEnrollViewController ()<JXCategoryViewDelegate, JXCategoryListContainerViewDelegate, MerchantEnrollContentViewDelegate>
- @property (nonatomic, assign) MerchantEnrollStep currentStep;
- @property (nonatomic, strong) NavigationBarView *navBar;
- @property (nonatomic, strong) UIImageView *bgImageView;
- @property (nonatomic, strong) UILabel *titleLabel;
- @property (nonatomic, strong) UIStackView *stepsStackView;
- @property (nonatomic, strong) UIView *step1View;
- @property (nonatomic, strong) UIView *step2View;
- @property (nonatomic, strong) UIView *step3View;
- @property (nonatomic, strong) UIImageView *line1ImageView;
- @property (nonatomic, strong) UIImageView *line2ImageView;
- @property (nonatomic, strong) NSMutableArray<UIButton *> *buttons;
- @property (nonatomic, strong) JXCategoryTitleView *categoryView;
- @property (nonatomic, strong) JXCategoryListContainerView *containerView;
- @property (nonatomic, copy) NSArray *list;
- @property (nonatomic, strong, nullable) MerchantEnrollGuideView *guideView;
- @property (nonatomic, strong, nullable) MerchantEnrollCheckListView *checkListView;
- @property (nonatomic, strong, nullable) MerchantEnrollResultView *resultView;
- @property (nonatomic, assign) NSInteger selectedIndex;
- @end
- @implementation MerchantEnrollViewController
- #pragma mark - 步骤恢复
- - (void)restoreCurrentStep {
- // 从数据管理器获取上次保存的步骤
- MerchantEnrollStep savedStep = [[MerchantEnrollDataManager sharedManager] getCurrentStep];
- self.currentStep = savedStep;
-
- // 根据步骤设置selectedIndex
- if (self.currentStep > MerchantEnrollStepCheckList && self.currentStep < MerchantEnrollStepWatingForReview) {
- self.selectedIndex = self.currentStep - 2; // 减去Guide和CheckList步骤
- } else {
- self.selectedIndex = 0;
- }
- }
- #pragma mark - 数据保存和恢复
- - (void)saveCurrentStepData {
- MerchantBaseEnrollContentView *currentView = [self getCurrentContentView];
- if (!currentView) return;
-
- NSDictionary *data = nil;
- MerchantEnrollDataManager *dataManager = [MerchantEnrollDataManager sharedManager];
-
- switch (self.currentStep) {
- case MerchantEnrollStepStoreInfo:
- if ([currentView isKindOfClass:[MerchantStoreInfoView class]]) {
- MerchantStoreInfoView *storeView = (MerchantStoreInfoView *)currentView;
- data = [storeView getMerchantEnrollParameters];
- [dataManager saveStoreInfoData:data];
- }
- break;
- case MerchantEnrollStepBusinessLicense:
- if ([currentView respondsToSelector:@selector(getMerchantEnrollParameters)]) {
- data = [currentView performSelector:@selector(getMerchantEnrollParameters)];
- [dataManager saveBusinessLicenseData:data];
- }
- break;
- case MerchantEnrollStepLegalInfo:
- if ([currentView respondsToSelector:@selector(getMerchantEnrollParameters)]) {
- data = [currentView performSelector:@selector(getMerchantEnrollParameters)];
- [dataManager saveLegalInfoData:data];
- }
- break;
- case MerchantEnrollStepBank:
- if ([currentView respondsToSelector:@selector(getMerchantEnrollParameters)]) {
- data = [currentView performSelector:@selector(getMerchantEnrollParameters)];
- [dataManager saveBankInfoData:data];
- }
- break;
- case MerchantEnrollStepSetAdmin:
- if ([currentView respondsToSelector:@selector(getMerchantEnrollParameters)]) {
- data = [currentView performSelector:@selector(getMerchantEnrollParameters)];
- [dataManager saveAdminSetupData:data];
- }
- break;
- default:
- break;
- }
- }
- - (MerchantBaseEnrollContentView *)getCurrentContentView {
- // 获取当前显示的内容视图
- if (self.currentStep > MerchantEnrollStepCheckList && self.currentStep < MerchantEnrollStepWatingForReview) {
- // 从容器视图中获取当前视图
- UIView *listView = [self.containerView.validListDict objectForKey:@(self.selectedIndex)];
- if ([listView isKindOfClass:[MerchantBaseEnrollContentView class]]) {
- return (MerchantBaseEnrollContentView *)listView;
- }
- }
- return nil;
- }
- - (void)fillDataForContentView:(MerchantBaseEnrollContentView *)contentView withStep:(MerchantEnrollStep)step {
- if (!contentView) return;
-
- MerchantEnrollDataManager *dataManager = [MerchantEnrollDataManager sharedManager];
- NSDictionary *savedData = nil;
-
- // 根据步骤获取相应的保存数据
- switch (step) {
- case MerchantEnrollStepStoreInfo:
- savedData = [dataManager getStoreInfoData];
- if (savedData && [contentView respondsToSelector:@selector(fillWithData:)]) {
- [contentView performSelector:@selector(fillWithData:) withObject:savedData];
- }
- break;
- case MerchantEnrollStepBusinessLicense:
- savedData = [dataManager getBusinessLicenseData];
- if (savedData && [contentView respondsToSelector:@selector(fillWithData:)]) {
- [contentView performSelector:@selector(fillWithData:) withObject:savedData];
- }
- break;
- case MerchantEnrollStepLegalInfo:
- savedData = [dataManager getLegalInfoData];
- if (savedData && [contentView respondsToSelector:@selector(fillWithData:)]) {
- [contentView performSelector:@selector(fillWithData:) withObject:savedData];
- }
- break;
- case MerchantEnrollStepBank:
- savedData = [dataManager getBankInfoData];
- if (savedData && [contentView respondsToSelector:@selector(fillWithData:)]) {
- [contentView performSelector:@selector(fillWithData:) withObject:savedData];
- }
- break;
- case MerchantEnrollStepSetAdmin:
- savedData = [dataManager getAdminSetupData];
- if (savedData && [contentView respondsToSelector:@selector(fillWithData:)]) {
- [contentView performSelector:@selector(fillWithData:) withObject:savedData];
- }
- break;
- default:
- break;
- }
- }
- - (void)viewDidLoad {
- [super viewDidLoad];
- self.view.backgroundColor = [UIColor whiteColor];
- [IQKeyboardManager sharedManager].enable = YES;
- [IQKeyboardManager sharedManager].enableAutoToolbar = YES;
-
- // 恢复上次的步骤
- [self restoreCurrentStep];
-
- [self setupNavigationBar];
- [self setupStepsUI];
- [self showCurrentStep];
- }
- - (void)viewWillAppear:(BOOL)animated {
- [super viewWillAppear:animated];
- self.navigationController.navigationBar.hidden = YES;
- }
- - (void)viewWillDisappear:(BOOL)animated {
- [super viewWillDisappear:animated];
- self.navigationController.navigationBar.hidden = NO;
- }
- #pragma mark - UI Setup
- - (void)setupNavigationBar {
- self.title = ASLocalizedString(@"商家入驻");
- [self.view addSubview:self.bgImageView];
- [self.view addSubview:self.navBar];
- self.navBar.titleLabel.text = self.title;
-
- [self.bgImageView mas_makeConstraints:^(MASConstraintMaker *make) {
- make.left.right.top.mas_offset(0);
- make.height.mas_equalTo(self.bgImageView.height);
- }];
-
- [self.navBar mas_makeConstraints:^(MASConstraintMaker *make) {
- make.top.right.left.mas_offset(0);
- make.height.mas_equalTo(self.navBar.height);
- }];
-
- }
- #pragma mark - Steps UI Setup
- - (void)setupStepsUI {
- [self.view addSubview:self.categoryView];
- [self.view addSubview:self.stepsStackView];
- [self.view addSubview:self.containerView];
- // 创建步骤视图
- [self.stepsStackView addArrangedSubview:self.step1View];
- [self.stepsStackView addArrangedSubview:self.step2View];
- [self.stepsStackView addArrangedSubview:self.step3View];
-
- [self.view addSubview:self.line1ImageView];
- [self.view addSubview:self.line2ImageView];
-
- // 设置步骤1(选中状态)
- [self setupStepView:self.step1View withNumber:@"1" title:ASLocalizedString(@"提交材料") isSelected:YES];
-
- // 设置步骤2(未选中状态)
- [self setupStepView:self.step2View withNumber:@"2" title:ASLocalizedString(@"平台审核") isSelected:NO];
-
- // 设置步骤3(未选中状态)
- [self setupStepView:self.step3View withNumber:@"3" title:ASLocalizedString(@"完成入驻") isSelected:NO];
-
- [self.stepsStackView mas_makeConstraints:^(MASConstraintMaker *make) {
- make.top.equalTo(self.navBar.mas_bottom).offset(kRealValue(20));
- make.centerX.mas_offset(0);
- make.left.right.mas_offset(0);
- make.height.mas_equalTo(kRealValue(80));
- }];
-
- [self.categoryView mas_makeConstraints:^(MASConstraintMaker *make) {
- make.edges.mas_equalTo(self.stepsStackView);
- }];
-
- [self.containerView mas_makeConstraints:^(MASConstraintMaker *make) {
- make.left.right.bottom.mas_offset(0);
- make.top.equalTo(self.stepsStackView.mas_bottom);
- }];
-
- [self.line1ImageView mas_makeConstraints:^(MASConstraintMaker *make) {
- make.size.mas_equalTo(CGSizeMake(kRealValue(70), kRealValue(8)));
- make.left.mas_offset(kRealValue(90));
- make.centerY.equalTo(self.stepsStackView).mas_offset(-kRealValue(20));
- }];
-
- [self.line2ImageView mas_makeConstraints:^(MASConstraintMaker *make) {
- make.size.mas_equalTo(CGSizeMake(kRealValue(70), kRealValue(8)));
- make.right.mas_offset(kRealValue(-90));
- make.centerY.equalTo(self.line1ImageView);
- }];
- }
- - (void)setupStepView:(UIView *)stepView withNumber:(NSString *)number title:(NSString *)title isSelected:(BOOL)isSelected {
-
- NSString *imageName = [NSString stringWithFormat:@"store_step_%@", number];
- NSString *selImageName = [NSString stringWithFormat:@"store_step_%@_sel", number];
- UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
- [button setTitle:title forState:UIControlStateNormal];
- button.titleLabel.font = [UIFont systemFontOfSize:12 weight:UIFontWeightMedium];
- [button setTitleColor:[UIColor colorWithHexString:@"#777777"] forState:UIControlStateNormal];
- [button setTitleColor:[UIColor blackColor] forState:UIControlStateSelected];
- [button setImage:[UIImage imageNamed:imageName] forState:UIControlStateNormal];
- [button setImage:[UIImage imageNamed:selImageName] forState:UIControlStateSelected];
- button.selected = isSelected;
- [button layoutImageTopSpace:3];
-
- // 添加视图
- [stepView addSubview:button];
- [button mas_makeConstraints:^(MASConstraintMaker *make) {
- make.edges.mas_offset(0);
- }];
-
- button.tag = [number integerValue];
- [self.buttons addObject:button];
- }
- - (void)showCurrentStep {
-
- if (self.guideView) {
- [self.guideView removeFromSuperview];
- self.guideView = nil;
- }
-
- if (self.checkListView) {
- [self.checkListView removeFromSuperview];
- self.guideView = nil;
- }
-
-
- if (self.currentStep <= MerchantEnrollStepCheckList) {
- self.stepsStackView.hidden = YES;
- self.containerView.hidden = YES;
- self.line1ImageView.hidden = YES;
- self.line2ImageView.hidden = YES;
-
- MerchantBaseEnrollContentView *contentView;
- switch (self.currentStep) {
- case MerchantEnrollStepGuide:
- self.guideView = [[MerchantEnrollGuideView alloc] initWithFrame:CGRectMake(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT-self.bgImageView.height+kRealValue(60))];
- contentView = self.guideView;
- break;
- case MerchantEnrollStepCheckList:
- self.checkListView = [[MerchantEnrollCheckListView alloc] initWithFrame:CGRectMake(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT-self.bgImageView.height+kRealValue(100))];
- contentView = self.checkListView;
- break;
- default:
- break;
- }
-
- if (contentView) {
- contentView.currentStep = self.currentStep;
- contentView.delegate = self;
- [self.view addSubview:contentView];
- [contentView mas_makeConstraints:^(MASConstraintMaker *make) {
- make.size.mas_equalTo(contentView.size);
- make.bottom.inset(0);
- make.centerX.mas_offset(0);
- }];
- }
- } else {
- self.line1ImageView.hidden = NO;
- self.line2ImageView.hidden = NO;
- if (self.buttons.count > 1) {
- UIButton *second = self.buttons[1];
- second.selected = self.currentStep >= MerchantEnrollStepWatingForReview;
- }
-
- NSString *name = self.currentStep >= MerchantEnrollStepWatingForReview ? @"store_line_blue" : @"store_line_gray(1)";
- self.line2ImageView.image = [UIImage imageNamed:name];
-
- UIButton *last = self.buttons.lastObject;
- last.selected = self.currentStep >= MerchantEnrollStepComplete;
-
- if (self.currentStep > MerchantEnrollStepCheckList && self.currentStep < MerchantEnrollStepWatingForReview) {
- self.stepsStackView.hidden = NO;
- self.containerView.hidden = NO;
- [self.categoryView selectItemAtIndex:self.selectedIndex];
- } else {
- self.stepsStackView.hidden = NO;
- self.containerView.hidden = YES;
- switch (self.currentStep) {
- case MerchantEnrollStepWatingForReview:
- [self showEnrollResult:MerchantEnrollResultPending];
- break;
- case MerchantEnrollStepReviewFail:
- [self showEnrollResult:MerchantEnrollResultFailed];
- break;
- case MerchantEnrollStepComplete:
- [self showEnrollResult:MerchantEnrollResultSuccess];
- break;
- default:
- break;
- }
- }
- }
- }
- - (void)backButtonClicked:(UIButton *)sender {
- [self.navigationController popViewControllerAnimated:YES];
- }
- - (void)helpButtonClicked:(UIButton *)sender {
- // TODO: 显示帮助页面
- NSLog(@"Help button clicked");
- }
- - (void)showEnrollResult:(MerchantEnrollResultType)resultType {
- if (_resultView) {
- [_resultView removeFromSuperview];
- _resultView = nil;
- }
-
- // 添加结果页面
- MerchantEnrollResultView *resultView = [[MerchantEnrollResultView alloc]
- initWithResultType:resultType
- frame:CGRectMake(0, 0, SCREEN_WIDTH-24, SCREEN_HEIGHT-self.bgImageView.height+kRealValue(16))];
- [self.view addSubview:resultView];
- resultView.delegate = self;
- _resultView = resultView;
- [resultView mas_makeConstraints:^(MASConstraintMaker *make) {
- make.size.mas_equalTo(resultView.size);
- make.bottom.inset(0);
- make.centerX.mas_offset(0);
- }];
- }
- - (void)categoryView:(JXCategoryBaseView *)categoryView didSelectedItemAtIndex:(NSInteger)index {
- self.currentStep = [self.list[index] integerValue];
- self.selectedIndex = index;
- }
- - (id<JXCategoryListContentViewDelegate>)listContainerView:(JXCategoryListContainerView *)listContainerView initListForIndex:(NSInteger)index {
- MerchantBaseEnrollContentView *contentView;
- MerchantEnrollStep step = [self.list[index] integerValue];
- CGFloat height = SCREEN_HEIGHT-self.bgImageView.height+kRealValue(16);
- CGFloat width = SCREEN_WIDTH;
- CGRect frame = CGRectMake(0, 0, width, height);
- switch (step) {
- case MerchantEnrollStepStoreInfo:
- contentView = [[MerchantStoreInfoView alloc] initWithFrame:frame];
- break;
- case MerchantEnrollStepBusinessLicense:
- contentView = [[MerchantBusinessLicenseView alloc] initWithFrame:frame];
- break;
- case MerchantEnrollStepLegalInfo:
- contentView = [[MerchantLegalInfoView alloc] initWithFrame:frame];
- break;
- case MerchantEnrollStepBank:
- contentView = [[MerchantBankInfoView alloc] initWithFrame:frame];
- break;
- case MerchantEnrollStepSetAdmin:
- contentView = [[MerchantAdminSetupView alloc] initWithFrame:frame];
- break;
- case MerchantEnrollStepPay:
- contentView = [[MerchantPaymentView alloc] initWithFrame:frame];
- break;
-
- default:
- break;
- }
- contentView.delegate = self;
- contentView.currentStep = step;
-
- // 为视图填充保存的数据
- [self fillDataForContentView:contentView withStep:step];
-
- return contentView;
- }
- - (NSInteger)numberOfListsInlistContainerView:(JXCategoryListContainerView *)listContainerView {
- return self.list.count;
- }
- #pragma mark - MerchantEnrollContentViewDelegate
- - (void)onMerchantEnrollGotoNextButtonClick {
- // 保存当前步骤的数据
- [self saveCurrentStepData];
-
- self.currentStep++;
-
- // 保存步骤进度
- [[MerchantEnrollDataManager sharedManager] saveCurrentStep:self.currentStep];
-
- if (self.currentStep > MerchantEnrollStepCheckList && self.currentStep < MerchantEnrollStepWatingForReview) {
- self.selectedIndex = self.currentStep-2;
- }
- [self showCurrentStep];
- }
- - (void)onMerchantEnrollResultNextButtonClick:(MerchantEnrollResultType)type {
- switch (type) {
- case MerchantEnrollResultPending:
- [self.navigationController popViewControllerAnimated:YES];
- break;
- case MerchantEnrollResultFailed:
- self.currentStep = MerchantEnrollStepStoreInfo;
- // 保存当前步骤
- [[MerchantEnrollDataManager sharedManager] saveCurrentStep:self.currentStep];
- [self showCurrentStep];
- break;
- case MerchantEnrollResultSuccess:
- // 入驻成功,清除所有保存的数据
- [self clearAllSavedData];
- [self.navigationController popViewControllerAnimated:YES];
- break;
- }
- }
- #pragma mark - 数据清理
- - (void)clearAllSavedData {
- MerchantEnrollDataManager *dataManager = [MerchantEnrollDataManager sharedManager];
- [dataManager clearStepRecord];
- [dataManager clearAllData];
- }
- - (void)resetEnrollProcess {
- // 清除所有保存的数据
- [self clearAllSavedData];
-
- // 重置到第一步
- self.currentStep = MerchantEnrollStepStoreInfo;
- self.selectedIndex = 0;
-
- // 刷新界面显示
- [self showCurrentStep];
- }
- - (NavigationBarView *)navBar {
- if (!_navBar) {
- _navBar = [[NavigationBarView alloc] initWithFrame:CGRectMake(0, 0, SCREEN_WIDTH, STATUS_BAR_HEIGHT+44)];
- _navBar.backgroundColor = UIColor.clearColor;
- _navBar.contentView.backgroundColor = UIColor.clearColor;
-
- WeakSelf
- [_navBar setOnBackButtonkAction:^{
- [weakSelf.navigationController popViewControllerAnimated:YES];
- }];
-
- [_navBar setOnRightButtonkAction:^{
-
- }];
- }
- return _navBar;
- }
- - (UIImageView *)bgImageView {
- if (!_bgImageView) {
- _bgImageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, SCREEN_WIDTH, kRealValue(200))];
- _bgImageView.contentMode = UIViewContentModeScaleAspectFill;
- _bgImageView.image = [UIImage imageNamed:@"store_header_bg"];
- }
- return _bgImageView;
- }
- - (UIStackView *)stepsStackView {
- if (!_stepsStackView) {
- UIStackView *stackView = [[UIStackView alloc] init];
- stackView.axis = UILayoutConstraintAxisHorizontal;
- stackView.distribution = UIStackViewDistributionFill;
- stackView.alignment = UIStackViewAlignmentCenter;
- stackView.spacing = 0;
- _stepsStackView = stackView;
- }
- return _stepsStackView;
- }
- - (UIView *)step1View {
- if (!_step1View) {
- _step1View = [[UIView alloc] init];
- }
- return _step1View;
- }
- - (UIView *)step2View {
- if (!_step2View) {
- _step2View = [[UIView alloc] init];
- }
- return _step2View;
- }
- - (UIView *)step3View {
- if (!_step3View) {
- _step3View = [[UIView alloc] init];
- }
- return _step3View;
- }
- - (UIImageView *)line1ImageView {
- if (!_line1ImageView) {
- _line1ImageView = [[UIImageView alloc] init];
- _line1ImageView.image = [UIImage imageNamed:@"store_line_blue"];
- _line1ImageView.contentMode = UIViewContentModeScaleAspectFit;
- }
- return _line1ImageView;
- }
- - (UIImageView *)line2ImageView {
- if (!_line2ImageView) {
- _line2ImageView = [[UIImageView alloc] init];
- _line2ImageView.image = [UIImage imageNamed:@"store_line_gray(1)"];
- _line2ImageView.contentMode = UIViewContentModeScaleAspectFit;
- }
- return _line2ImageView;
- }
- - (JXCategoryTitleView *)categoryView {
- if (!_categoryView) {
- NSMutableArray *array = [NSMutableArray array];
- for (NSNumber *num in self.list) {
- [array addObject:[NSString stringWithFormat:@"%ld", [num integerValue]]];
- }
- _categoryView = [[JXCategoryTitleView alloc] initWithFrame:CGRectZero];
- _categoryView.delegate = self;
- _categoryView.titles = array;
- _categoryView.listContainer = self.containerView;
- _categoryView.hidden = YES;
- _categoryView.defaultSelectedIndex = self.selectedIndex;
- }
- return _categoryView;
- }
- - (JXCategoryListContainerView *)containerView {
- if (!_containerView) {
- _containerView = [[JXCategoryListContainerView alloc] initWithType:JXCategoryListContainerType_CollectionView delegate:self];
- }
- return _containerView;
- }
- - (NSArray *)list {
- if (!_list) {
- _list = @[
- @(MerchantEnrollStepStoreInfo),
- @(MerchantEnrollStepBusinessLicense),
- @(MerchantEnrollStepLegalInfo),
- @(MerchantEnrollStepBank),
- @(MerchantEnrollStepSetAdmin),
- @(MerchantEnrollStepPay)
- ];
- }
- return _list;
- }
- - (NSMutableArray<UIButton *> *)buttons {
- if (!_buttons) {
- _buttons = [NSMutableArray array];
- }
- return _buttons;
- }
- @end
|