viewModel優(yōu)化tableView思路整理

閱讀代碼SigmaTableViewModel嫡秕,寫(xiě)下看到的思路丸凭。如有侵權(quán)钙蒙,請(qǐng)聯(lián)系我刪除茵瀑,謝謝

1、創(chuàng)建ViewModel 類:
  • 設(shè)置YZSTableViewModelDelegate 協(xié)議躬厌,協(xié)議方法為空
  • 設(shè)置sectionModel數(shù)組马昨,sectionModel中有個(gè)屬性數(shù)組存放單獨(dú)的cellModel竞帽;
  • 設(shè)置delegate:YZSTableViewModelDelegate,用于避免tableView的代理方法未實(shí)現(xiàn)的警告
  • 獲取sectionModel的key方法
  • 獲取cellModel的key方法
  • 對(duì)sectionModel進(jìn)行增鸿捧、刪屹篓、刷新方法(非線程安全方法)
  • 對(duì)cellModel進(jìn)行增、刪匙奴、刷新方法(非線程安全方法)
2堆巧、創(chuàng)建sectionModel 類:
  • 設(shè)置cellModel數(shù)組,數(shù)組存放單獨(dú)的cellModel;
  • 設(shè)置sectionModel的屬性
  • 設(shè)置sectionModel的key泼菌,用于識(shí)別不同的sectionModel
  • 聲明header谍肤、footer的回調(diào);用于設(shè)置headerView哗伯、footerView.
3荒揣、設(shè)置cellModel類:
  • 設(shè)置cellModel屬性
  • 設(shè)置cellModel的key,用于識(shí)別不同的cellModel
  • 聲明返回cell的回調(diào):在回調(diào)中設(shè)置cell焊刹,必須設(shè)置方法
  • 聲明返回cell高度的回調(diào):在回調(diào)中設(shè)置cell高度
  • 聲明即將顯示的cell的回調(diào):
  • 聲明即將顯示的cell的回調(diào):
  • 聲明將要選擇的cell的回調(diào):
  • 聲明將要取消選擇的cell的回調(diào):
  • 聲明選擇的cell的回調(diào):
  • 聲明取消選擇的cell的回調(diào):
  • 聲明提交編輯的cell的回調(diào):
  • 聲明應(yīng)該突出顯示的高度回調(diào)
  • 系任。。虐块。赋除。 等等 tableView代理方法的回調(diào)
4、在Controller中使用:
  • 遵循代理<YZSTableViewModelDelegate>
  • 設(shè)置屬性viewModel非凌;
- (YZSTableViewModel*)viewModel {
   if(!_viewModel) {
       _viewModel = [[YZSTableViewModel alloc] init];
       self.tableView.dataSource = _viewModel;
       self.tableView.delegate = _viewModel;
       _viewModel.delegate = self;
   }
   return _viewModel;
}
  • 在viewDidLoad方法中實(shí)現(xiàn)模型數(shù)據(jù)加載:
- (void)reloadViewModel {
    [self.viewModel.sectionModelArray removeAllObjects];
    //shop info section
    {
        YZSTableViewSectionModel *sectionModel = [[YZSTableViewSectionModel alloc] init];
        [self.viewModel.sectionModelArray addObject:sectionModel];
        sectionModel.headerTitle = @"Shop Info";
        static NSString *CellIdentifier = @"ShopCell";
        YZWeak(self);
        //shop details entrance
        YZSTableViewCellModel *cellModel = [[YZSTableViewCellModel alloc] init];
        [sectionModel.cellModelArray addObject:cellModel];
        cellModel.height = 44;
        cellModel.renderBlock = ^UITableViewCell * _Nonnull(NSIndexPath * _Nonnull indexPath, UITableView * _Nonnull tableView) {
            YZStrong(self)
            UITableViewCell *cell = [self reusableCellWithId:CellIdentifier inView:tableView];
            cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
            cell.selectionStyle = UITableViewCellSelectionStyleDefault;
            id<ShopModuleService> shopModule = BFModule(ShopModuleService);
            cell.imageView.image = shopModule.shopLogo;
            NSString *text = BFStr(@"Shop Name: %@", shopModule.shopName);
            cell.textLabel.text = text;
            return cell;
        };
        cellModel.selectionBlock = ^(NSIndexPath * _Nonnull indexPath, UITableView * _Nonnull tableView) {
            [tableView deselectRowAtIndexPath:indexPath animated:YES];
            UIViewController *vc = [Bifrost handleURL:kRouteShopDetail];
            if (vc) {
                [self.navigationController pushViewController:vc animated:YES];
            }
        };
        //revenue info
        cellModel = [[YZSTableViewCellModel alloc] init];
        [sectionModel.cellModelArray addObject:cellModel];
        cellModel.height = 44;
        cellModel.renderBlock = ^UITableViewCell * _Nonnull(NSIndexPath * _Nonnull indexPath, UITableView * _Nonnull tableView) {
            YZStrong(self)
            UITableViewCell *cell = [self reusableCellWithId:CellIdentifier inView:tableView];
            NSString *text = BFStr(@"Revenue: ¥%.2f", [BFModule(ShopModuleService) shopRevenue]);
            cell.textLabel.text = text;
            cell.accessoryType = UITableViewCellAccessoryNone;
            cell.selectionStyle = UITableViewCellSelectionStyleNone;
            return cell;
        };
    }
    //goods info section
    {
        YZSTableViewSectionModel *sectionModel = [[YZSTableViewSectionModel alloc] init];
        [self.viewModel.sectionModelArray addObject:sectionModel];
        sectionModel.headerTitle = @"Popular Goods";
        static NSString *CellIdentifier = @"GoodsCell";
        YZWeak(self);
        //popular goods list
        NSArray *list = [BFModule(GoodsModuleService) popularGoodsList];
        for (id<GoodsProtocol> goods in list) {
            YZSTableViewCellModel *cellModel = [[YZSTableViewCellModel alloc] init];
            [sectionModel.cellModelArray addObject:cellModel];
            cellModel.height = 44;
            cellModel.renderBlock = ^UITableViewCell * _Nonnull(NSIndexPath * _Nonnull indexPath, UITableView * _Nonnull tableView) {
                YZStrong(self)
                UITableViewCell *cell = [self reusableCellWithId:CellIdentifier inView:tableView];
                cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
                NSString *text = BFStr(@"%@ : ¥%.2f", goods.name, goods.price);
                cell.textLabel.text = text;
                return cell;
            };
            cellModel.selectionBlock = ^(NSIndexPath * _Nonnull indexPath, UITableView * _Nonnull tableView) {
                [tableView deselectRowAtIndexPath:indexPath animated:YES];
                NSString *routeURL = BFStr(@"%@?%@=%@", kRouteGoodsDetail, kRouteGoodsDetailParamId, goods.goodsId);
                UIViewController *vc = [Bifrost handleURL:routeURL];
                if (vc) {
                    [self.navigationController pushViewController:vc animated:YES];
                }
            };
        }
        //all goods entry
        YZSTableViewCellModel *cellModel = [[YZSTableViewCellModel alloc] init];
        [sectionModel.cellModelArray addObject:cellModel];
        cellModel.height = 44;
        cellModel.renderBlock = ^UITableViewCell * _Nonnull(NSIndexPath * _Nonnull indexPath, UITableView * _Nonnull tableView) {
            YZStrong(self)
            UITableViewCell *cell = [self reusableCellWithId:CellIdentifier inView:tableView];
            cell.textLabel.text = @"More Goods...";
            cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
            return cell;
        };
        cellModel.selectionBlock = ^(NSIndexPath * _Nonnull indexPath, UITableView * _Nonnull tableView) {
            [tableView deselectRowAtIndexPath:indexPath animated:YES];
            UIViewController *vc = [Bifrost handleURL:kRouteAllGoodsList];
            if (vc) {
                [self.navigationController pushViewController:vc animated:YES];
            }
        };
    }
    [self.tableView reloadData];
}

- (UITableViewCell*)reusableCellWithId:(NSString*)identifier
                                inView:(UITableView*)tableView {
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];
    if (!cell) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault
                                      reuseIdentifier:identifier];
    }
    return cell;
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市荆针,隨后出現(xiàn)的幾起案子敞嗡,更是在濱河造成了極大的恐慌,老刑警劉巖航背,帶你破解...
    沈念sama閱讀 211,123評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件喉悴,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡玖媚,警方通過(guò)查閱死者的電腦和手機(jī)箕肃,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)今魔,“玉大人勺像,你說(shuō)我怎么就攤上這事〈砩” “怎么了吟宦?”我有些...
    開(kāi)封第一講書(shū)人閱讀 156,723評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)涩维。 經(jīng)常有香客問(wèn)我殃姓,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,357評(píng)論 1 283
  • 正文 為了忘掉前任蜗侈,我火速辦了婚禮篷牌,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘踏幻。我一直安慰自己枷颊,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,412評(píng)論 5 384
  • 文/花漫 我一把揭開(kāi)白布叫倍。 她就那樣靜靜地躺著偷卧,像睡著了一般。 火紅的嫁衣襯著肌膚如雪吆倦。 梳的紋絲不亂的頭發(fā)上听诸,一...
    開(kāi)封第一講書(shū)人閱讀 49,760評(píng)論 1 289
  • 那天,我揣著相機(jī)與錄音蚕泽,去河邊找鬼晌梨。 笑死,一個(gè)胖子當(dāng)著我的面吹牛须妻,可吹牛的內(nèi)容都是我干的仔蝌。 我是一名探鬼主播,決...
    沈念sama閱讀 38,904評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼荒吏,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼敛惊!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起绰更,我...
    開(kāi)封第一講書(shū)人閱讀 37,672評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤瞧挤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后儡湾,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體特恬,經(jīng)...
    沈念sama閱讀 44,118評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,456評(píng)論 2 325
  • 正文 我和宋清朗相戀三年徐钠,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了癌刽。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,599評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡尝丐,死狀恐怖显拜,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情摊崭,我是刑警寧澤讼油,帶...
    沈念sama閱讀 34,264評(píng)論 4 328
  • 正文 年R本政府宣布,位于F島的核電站呢簸,受9級(jí)特大地震影響矮台,放射性物質(zhì)發(fā)生泄漏乏屯。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,857評(píng)論 3 312
  • 文/蒙蒙 一瘦赫、第九天 我趴在偏房一處隱蔽的房頂上張望辰晕。 院中可真熱鬧,春花似錦确虱、人聲如沸含友。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,731評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)窘问。三九已至,卻和暖如春宜咒,著一層夾襖步出監(jiān)牢的瞬間惠赫,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,956評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工故黑, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留儿咱,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,286評(píng)論 2 360
  • 正文 我出身青樓场晶,卻偏偏與公主長(zhǎng)得像混埠,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子诗轻,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,465評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • Swift1> Swift和OC的區(qū)別1.1> Swift沒(méi)有地址/指針的概念1.2> 泛型1.3> 類型嚴(yán)謹(jǐn) 對(duì)...
    cosWriter閱讀 11,090評(píng)論 1 32
  • 2017.02.22 可以練習(xí)钳宪,每當(dāng)這個(gè)時(shí)候,腦袋就犯困扳炬,我這腦袋真是神奇呀使套,一說(shuō)讓你做事情,你就犯困鞠柄,你可不要太...
    Carden閱讀 1,331評(píng)論 0 1
  • iOS網(wǎng)絡(luò)架構(gòu)討論梳理整理中。嫉柴。厌杜。 其實(shí)如果沒(méi)有APIManager這一層是沒(méi)法使用delegate的,畢竟多個(gè)單...
    yhtang閱讀 5,172評(píng)論 1 23
  • 我們?cè)谏弦黄锻ㄟ^(guò)代碼自定義不等高cell》中學(xué)習(xí)了tableView的相關(guān)知識(shí)计螺,本文將在上文的基礎(chǔ)上夯尽,利用sto...
    啊世ka閱讀 1,501評(píng)論 2 7
  • 1.badgeVaule氣泡提示 2.git終端命令方法> pwd查看全部 >cd>ls >之后桌面找到文件夾內(nèi)容...
    i得深刻方得S閱讀 4,640評(píng)論 1 9