關(guān)于TZImagePickerController單選圖片返回重復(fù)的問題

最近項目告一段落盛正,也有時間來總結(jié)一下使用第三方控件遇到的小坑了雀扶。
之前遇到的“來自未來的照片”應(yīng)該算是圓滿解決关摇,之后又出現(xiàn)了新的需求荒叶,故又遇到了一些新的問題。
如題输虱。
那么這個問題是怎么產(chǎn)生的呢些楣?TZImage如果是單選模式下,而我們又沒有開啟選中按鈕的時候。點(diǎn)擊圖片會進(jìn)入到圖片預(yù)覽中戈毒,此時如果我們選好的圖片點(diǎn)擊右上方的完成按鈕艰猬,TZimage選擇器會自動dismiss掉(如果我們沒有設(shè)置autoDismiss的話)

/// Default is YES, if set NO, the picker don't dismiss itself.
/// 默認(rèn)為YES,如果設(shè)置為NO, 選擇器將不會自己dismiss
@property(nonatomic, assign) BOOL autoDismiss;

OK埋市,那么重點(diǎn)來了冠桃。我們現(xiàn)在的需求就是不讓其自行dismiss,我們可能會突然不滿意現(xiàn)在選中的圖片了道宅,想要返回到photoPicker中再重新選擇圖片食听。那么如果我們之前dismiss了,就需要重新打開相冊污茵,造成一些不太好的用戶體驗樱报。
75B2F3D4D388A6A775C17AADC341DBD0.jpg

所以我們想要用戶可以重復(fù)預(yù)覽,并且重新選擇照片(我們的需求是選擇好照片后進(jìn)入編輯照片頁面泞当,當(dāng)然照片編輯器不是TZImage提供的)迹蛤。此時問題出現(xiàn)了,我們每次點(diǎn)擊照片時預(yù)覽都是OK的襟士,沒有毛病盗飒。但是當(dāng)選中一張照片進(jìn)入編輯頁面后,再次返回到預(yù)覽頁換一張圖片進(jìn)入編輯頁陋桂,拿到的永遠(yuǎn)是第一次選中的圖片逆趣。

起初我以為是每次返回的都是同一個對象,于是打上斷點(diǎn)查看一下嗜历。
<TZAssetModel: 0x1c045c830> //第一次返回
<TZAssetModel: 0x1c0641b30> //第二次返回
可以看到每次返回的對象是不同的宣渗。那么奇怪了,不同的Asset對象梨州,顯示的卻是同一張圖片痕囱?
繼續(xù)查看TZImage的源碼,發(fā)現(xiàn)了這么一個東西:

/// The photos user have selected
/// 用戶選中過的圖片數(shù)組
@property (nonatomic, strong) NSMutableArray *selectedAssets;
@property (nonatomic, strong) NSMutableArray<TZAssetModel *> *selectedModels;

看來我們只看當(dāng)前選中的圖片還是太天真了摊唇,TZImage選擇圖片全部都會存入這個選中的圖片數(shù)組中咐蝇。單選也不例外,從TZImage的block中也能看出來

@property (nonatomic, copy) void (^didFinishPickingPhotosHandle)(NSArray<UIImage *> *photos,NSArray *assets,BOOL isSelectOriginalPhoto);
@property (nonatomic, copy) void (^didFinishPickingPhotosWithInfosHandle)(NSArray<UIImage *> *photos,NSArray *assets,BOOL isSelectOriginalPhoto,NSArray<NSDictionary *> *infos);

可以看到這個block中返回的圖片是一個數(shù)組巷查。問題找到了有序,一定是這個保存選中圖片的數(shù)組沒有更新。查看了一下代碼岛请,果然如此旭寿。

- (void)select:(UIButton *)selectButton {
    TZImagePickerController *_tzImagePickerVc = (TZImagePickerController *)self.navigationController;
    TZAssetModel *model = _models[_currentIndex];
    if (!selectButton.isSelected) {
        // 1. select:check if over the maxImagesCount / 選擇照片,檢查是否超過了最大個數(shù)的限制
        if (_tzImagePickerVc.selectedModels.count >= _tzImagePickerVc.maxImagesCount) {
            NSString *title = [NSString stringWithFormat:[NSBundle tz_localizedStringForKey:@"Select a maximum of %zd photos"], _tzImagePickerVc.maxImagesCount];
            [_tzImagePickerVc showAlertWithTitle:title];
            return;
            // 2. if not over the maxImagesCount / 如果沒有超過最大個數(shù)限制
        } else {
            [_tzImagePickerVc.selectedModels addObject:model];
            if (self.photos) {
                [_tzImagePickerVc.selectedAssets addObject:_assetsTemp[_currentIndex]];
                [self.photos addObject:_photosTemp[_currentIndex]];
            }
            if (model.type == TZAssetModelMediaTypeVideo && !_tzImagePickerVc.allowPickingMultipleVideo) {
                [_tzImagePickerVc showAlertWithTitle:[NSBundle tz_localizedStringForKey:@"Select the video when in multi state, we will handle the video as a photo"]];
            }
        }
    } else {
        NSArray *selectedModels = [NSArray arrayWithArray:_tzImagePickerVc.selectedModels];
        for (TZAssetModel *model_item in selectedModels) {
            if ([[[TZImageManager manager] getAssetIdentifier:model.asset] isEqualToString:[[TZImageManager manager] getAssetIdentifier:model_item.asset]]) {
                // 1.6.7版本更新:防止有多個一樣的model,一次性被移除了
                NSArray *selectedModelsTmp = [NSArray arrayWithArray:_tzImagePickerVc.selectedModels];
                for (NSInteger i = 0; i < selectedModelsTmp.count; i++) {
                    TZAssetModel *model = selectedModelsTmp[i];
                    if ([model isEqual:model_item]) {
                        [_tzImagePickerVc.selectedModels removeObjectAtIndex:i];
                        break;
                    }
                }
                // [_tzImagePickerVc.selectedModels removeObject:model_item];
                if (self.photos) {
                    // 1.6.7版本更新:防止有多個一樣的asset,一次性被移除了
                    NSArray *selectedAssetsTmp = [NSArray arrayWithArray:_tzImagePickerVc.selectedAssets];
                    for (NSInteger i = 0; i < selectedAssetsTmp.count; i++) {
                        id asset = selectedAssetsTmp[i];
                        if ([asset isEqual:_assetsTemp[_currentIndex]]) {
                            [_tzImagePickerVc.selectedAssets removeObjectAtIndex:i];
                            break;
                        }
                    }
                    // [_tzImagePickerVc.selectedAssets removeObject:_assetsTemp[_currentIndex]];
                    [self.photos removeObject:_photosTemp[_currentIndex]];
                }
                break;
            }
        }
    }
    model.isSelected = !selectButton.isSelected;
    [self refreshNaviBarAndBottomBarState];
    if (model.isSelected) {
        [UIView showOscillatoryAnimationWithLayer:selectButton.imageView.layer type:TZOscillatoryAnimationToBigger];
    }
    [UIView showOscillatoryAnimationWithLayer:_numberImageView.layer type:TZOscillatoryAnimationToSmaller];
}

作者的思路還是很嚴(yán)禁的,如果是復(fù)選的情況崇败,或者是單選模式下有選中按鈕的情況盅称,是可以移除掉之前選中的圖片的肩祥。但是如果沒有選中按鈕,重新選擇照片時就無法移除之前選擇的照片(或許作者根本沒想過誰會這么奇葩缩膝,點(diǎn)了完成不dismiss卻要做點(diǎn)花里胡哨的)混狠。

那么好,問題找到了疾层,不是什么大問題将饺。上解決代碼:

// 如果沒有選中過照片 點(diǎn)擊確定時選中當(dāng)前預(yù)覽的照片
    if (_tzImagePickerVc.selectedModels.count == 0 && _tzImagePickerVc.minImagesCount <= 0) {
        TZAssetModel *model = _models[_currentIndex];
        [_tzImagePickerVc.selectedModels addObject:model];
    }

這是原來的代碼,我加了一個判斷:

 TZAssetModel *model = _models[_currentIndex];
    // 如果沒有選中過照片 點(diǎn)擊確定時選中當(dāng)前預(yù)覽的照片
    if (_tzImagePickerVc.selectedModels.count == 0 && _tzImagePickerVc.minImagesCount <= 0) {
        [_tzImagePickerVc.selectedModels addObject:model];
    }
    //  如果是單選痛黎,重新選擇了照片之后應(yīng)該移除之前選中的照片
    else if (_tzImagePickerVc.maxImagesCount == 1) {
        [_tzImagePickerVc.selectedModels removeAllObjects];
        [_tzImagePickerVc.selectedModels addObject:model];
    }

OK予弧,圓滿解決。暫時沒有遇到別的問題湖饱。

PS:如果各位同學(xué)是使用的pod導(dǎo)入的代碼掖蛤,不建議在pod中直接修改TZImage的源碼,原因是萬一使用pod更新了源碼井厌,之前做的修改可能就不存在了蚓庭。我是直接將TZImage拖入到了項目中,隨便你怎么鼓搗仅仆。

大佬們的鞭策呢彪置。。蝇恶。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市惶桐,隨后出現(xiàn)的幾起案子撮弧,更是在濱河造成了極大的恐慌,老刑警劉巖姚糊,帶你破解...
    沈念sama閱讀 219,427評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件贿衍,死亡現(xiàn)場離奇詭異,居然都是意外死亡救恨,警方通過查閱死者的電腦和手機(jī)贸辈,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,551評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來肠槽,“玉大人擎淤,你說我怎么就攤上這事〗障桑” “怎么了嘴拢?”我有些...
    開封第一講書人閱讀 165,747評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長寂纪。 經(jīng)常有香客問我席吴,道長赌结,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,939評論 1 295
  • 正文 為了忘掉前任孝冒,我火速辦了婚禮柬姚,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘庄涡。我一直安慰自己量承,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,955評論 6 392
  • 文/花漫 我一把揭開白布啼染。 她就那樣靜靜地躺著宴合,像睡著了一般。 火紅的嫁衣襯著肌膚如雪迹鹅。 梳的紋絲不亂的頭發(fā)上卦洽,一...
    開封第一講書人閱讀 51,737評論 1 305
  • 那天,我揣著相機(jī)與錄音斜棚,去河邊找鬼阀蒂。 笑死,一個胖子當(dāng)著我的面吹牛弟蚀,可吹牛的內(nèi)容都是我干的蚤霞。 我是一名探鬼主播,決...
    沈念sama閱讀 40,448評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼义钉,長吁一口氣:“原來是場噩夢啊……” “哼昧绣!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起捶闸,我...
    開封第一講書人閱讀 39,352評論 0 276
  • 序言:老撾萬榮一對情侶失蹤夜畴,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后删壮,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體贪绘,經(jīng)...
    沈念sama閱讀 45,834評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,992評論 3 338
  • 正文 我和宋清朗相戀三年央碟,在試婚紗的時候發(fā)現(xiàn)自己被綠了税灌。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,133評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡亿虽,死狀恐怖菱涤,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情洛勉,我是刑警寧澤狸窘,帶...
    沈念sama閱讀 35,815評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站坯认,受9級特大地震影響翻擒,放射性物質(zhì)發(fā)生泄漏氓涣。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,477評論 3 331
  • 文/蒙蒙 一陋气、第九天 我趴在偏房一處隱蔽的房頂上張望劳吠。 院中可真熱鬧,春花似錦巩趁、人聲如沸痒玩。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蠢古。三九已至,卻和暖如春别凹,著一層夾襖步出監(jiān)牢的瞬間草讶,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評論 1 272
  • 我被黑心中介騙來泰國打工炉菲, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留堕战,地道東北人。 一個月前我還...
    沈念sama閱讀 48,398評論 3 373
  • 正文 我出身青樓拍霜,卻偏偏與公主長得像嘱丢,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子祠饺,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,077評論 2 355

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

  • 前言 之前一篇文章里越驻,我詳細(xì)的講解了一些基本關(guān)鍵詞以及基本概念,這里再簡要列出來道偷,再溫故一下伐谈。 SEL 方法的名字...
    默默的前行閱讀 323評論 0 1
  • DAY43 今天從夏河一路坐車到合作,吃了午飯就繼續(xù)坐車來到了目的地――郎木寺试疙,一個很神奇的鎮(zhèn)子。一江分兩寺抠蚣,一鎮(zhèn)...
    小餡兒餅看星星閱讀 176評論 0 2
  • 今天最需要檢討的地方有看書看的不夠祝旷,本來需要看一百頁的,但沒看夠嘶窄,只看了三十頁怀跛,連最低的也沒看夠,另外柄冲,還有自己2...
    森林飛鷹閱讀 94評論 0 0
  • 現(xiàn)在的我對童年的記憶非常的模糊: 幾張照片吻谋、幾個小伙伴、哥哥弟弟现横。扔沙包漓拾、跳皮筋阁最、跳房子、砸瓶兒蓋骇两、摔方寶速种、拍洋畫...
    Da金子閱讀 330評論 3 3