使用 Runtime 禁止 UIAlertController 消失

項(xiàng)目里需要增加強(qiáng)制更新功能,此時(shí)使用的是系統(tǒng)的UIAlertController,結(jié)果點(diǎn)擊跳轉(zhuǎn)到App Store之后,彈框就消失了,這是因?yàn)橄到y(tǒng)默認(rèn)會(huì)自己dismiss,所以需要自己加個(gè)變量可以控制是否dismiss。


@dynamicft_rejectDismiss;

- (void)setFt_rejectDismiss:(BOOL)ft_rejectDismiss {

    objc_setAssociatedObject(self, @selector(ft_rejectDismiss), @(ft_rejectDismiss), OBJC_ASSOCIATION_ASSIGN);

}

- (BOOL)ft_rejectDismiss {

    return [(NSNumber *)objc_getAssociatedObject(self, _cmd) boolValue];

}

+ (void)load {

    static dispatch_once_t onceToken;

    dispatch_once(&onceToken, ^{

        Classclass = [selfclass];

        SEL originalSelector = NSSelectorFromString(@"_dismissAnimated:triggeringAction:triggeredByPopoverDimmingView:dismissCompletion:");

        SELswizzledSelector =@selector(ft_dismissAnimated:

                                         triggeringAction:

                                         triggeredByPopoverDimmingView:

                                         dismissCompletion:);

        MethodoriginalMethod =class_getInstanceMethod(class, originalSelector);

        MethodswizzledMethod =class_getInstanceMethod(class, swizzledSelector);

        // 動(dòng)態(tài)添加方法,如果類(lèi)中不存在這個(gè)方法的實(shí)現(xiàn),則添加成功

        // 這里 UIAlertController 類(lèi)中存在 originalMethod,所以添加是失敗的

        BOOLdidAddMethod =class_addMethod(class,

                                            originalSelector,

                                            method_getImplementation(swizzledMethod),

                                            method_getTypeEncoding(swizzledMethod));

        if(didAddMethod) {

            // 如果添加成功,則用 originalMethod 替換添加的空方法 originalMethod

            class_replaceMethod(class,

                                swizzledSelector,

                                method_getImplementation(originalMethod),

                                method_getTypeEncoding(originalMethod));

        }else{

            // 交換兩個(gè)方法的實(shí)現(xiàn)

            method_exchangeImplementations(originalMethod, swizzledMethod);

        }

    });

}

- (void)ft_dismissAnimated:(BOOL)animation

          triggeringAction:(UIAlertAction*)action

triggeredByPopoverDimmingView:(id)view

         dismissCompletion:(id)handler {

    // 如果點(diǎn)擊“取消”按鈕或者允許彈框 dismiss,就調(diào)用原來(lái)的方法(originalMethod)

    // 因?yàn)橐呀?jīng)交換了兩個(gè)方法的實(shí)現(xiàn),所以其實(shí)是調(diào)用 swizzledMethod

    // 所以這里并不會(huì)出現(xiàn)循環(huán)調(diào)用

    // 否則就忽略原來(lái)的方法(originalMethod),直接下一步,掉用后面的方法

    if (action.style == UIAlertActionStyleCancel || self.ft_rejectDismiss == NO) {

        [self ft_dismissAnimated:animation

                triggeringAction:action

   triggeredByPopoverDimmingView:view

               dismissCompletion:handler];

    }else{

        SEL invokeHandler = NSSelectorFromString(@"_invokeHandlersForAction:");

        // 這里如果使用 performSelector 來(lái)調(diào) invokeHandler 這個(gè)方法

        // [self performSelector:invokeHandler withObject:action];

        // 會(huì)報(bào) "PerformSelector may cause a leak because its selector is unknown" 的警告

        // 為消除警告,用下面的方法

        IMPimp = [selfmethodForSelector:invokeHandler];

        void(*func)(id,SEL,UIAlertAction*) = (void*)imp;

        func(self, invokeHandler, action);

    }

}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • ¥開(kāi)啟¥ 【iAPP實(shí)現(xiàn)進(jìn)入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開(kāi)一個(gè)線程,因...
    小菜c閱讀 7,363評(píng)論 0 17
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒(méi)有地址/指針的概念1.2> 泛型1.3> 類(lèi)型嚴(yán)謹(jǐn) 對(duì)...
    cosWriter閱讀 11,675評(píng)論 1 32
  • 2018年3月21日 星期三 晴 今天早上,羅敏毓說(shuō)她準(zhǔn)備在草地音樂(lè)節(jié)兒童集市上和我一起賣(mài)我們做的手工作品,我很高...
    福葉子閱讀 317評(píng)論 0 0
  • 不管你說(shuō)我冷漠也好,無(wú)情也罷。 其實(shí)是,我把我的熱情,給了在乎我的人和我在乎的人。
    隨心2018729閱讀 155評(píng)論 0 0
  • 漫長(zhǎng)的暑假過(guò)后,新的學(xué)年如約而至。我又開(kāi)始了騎電動(dòng)車(chē)帶兒子上下學(xué)的生活。二十多分鐘的路程,多日不坐電動(dòng)車(chē)的果...
    果粒媽閱讀 363評(píng)論 0 2

友情鏈接更多精彩內(nèi)容