-[UINavigationController setViewControllers:animated:] 這個方法執行後不會立即更改ViewControllers

 

測試代碼

- (void)setViewControllers:(NSArray<UIViewController *> *)viewControllers animated:(BOOL)animated{

    NSLog(@"setViewControllers animated%@",viewControllers);

    [super setViewControllers:viewControllers animated:animated];   

    NSLog(@"真實的%@ ",self.viewControllers);

}

打印一下可以發現並不一樣  ,爲什麼呢?

源碼看看setViewControllers 就是調用的setViewControllers:animated

void -[UINavigationController setViewControllers:](void * self, void * _cmd, void * arg2) {

    [self setViewControllers:arg2 animated:0x0];

    return;

}

void -[UINavigationController setViewControllers:animated:](void * self, void * _cmd, void * arg2, bool arg3) {
    r12 = arg3;
    r14 = _cmd;
    rbx = self;
    rax = [arg2 retain];
    var_-104 = __NSConcreteStackBlock;
    var_-56 = rax;
    *(&var_-104 + 0x8) = 0xc2000000;
    *(&var_-104 + 0x10) = ___54-[UINavigationController setViewControllers:animated:]_block_invoke;
    *(&var_-104 + 0x18) = ___block_descriptor_tmp.416;
    *(&var_-104 + 0x20) = rbx;
    var_-48 = objc_retainBlock(&var_-104);
    r13 = [[rbx _transitionCoordinator] retain];
    if (r13 == 0x0) goto loc_2a03e8;

loc_2a0366:
    if ([rbx _transitionConflictsWithNavigationTransitions:r13] == 0x0) goto loc_2a04ab;

loc_2a0381:
    r14 = [NSStringFromSelector(r14) retain];
    r12 = [NSStringFromClass([rbx class]) retain];
    NSLog(@"%@ called on <%@ %p> while an existing transition or presentation is occurring; the navigation stack will not be updated.", r14, r12, rbx);
    [r12 release];
    [r14 release];
    r15 = var_-56;
    goto loc_2a05ba;

loc_2a05ba:
    r14 = var_-48;
    goto loc_2a05d6;

loc_2a05d6:
    [r13 release];
    [r14 release];
    [r15 release];
    return;

loc_2a04ab:
    if ((r12 != 0x0) || ([r13 presentationStyle] == 0xffffffffffffffff)) goto loc_2a0559;

loc_2a04ce:
    var_-152 = __NSConcreteStackBlock;
    *(&var_-152 + 0x8) = 0xc2000000;
    *(&var_-152 + 0x10) = ___54-[UINavigationController setViewControllers:animated:]_block_invoke.426;
    *(&var_-152 + 0x18) = ___block_descriptor_tmp.429;
    r14 = var_-48;
    *(&var_-152 + 0x20) = [r14 retain];
    r15 = var_-56;
    *(&var_-152 + 0x28) = [var_-56 retain];
    [UIViewController _performWithoutDeferringTransitions:&var_-152];
    [*(&var_-152 + 0x28) release];
    [*(&var_-152 + 0x20) release];
    goto loc_2a05d6;

loc_2a0559:
    var_-264 = __NSConcreteStackBlock;
    *(&var_-264 + 0x8) = 0xc2000000;
    *(&var_-264 + 0x10) = ___54-[UINavigationController setViewControllers:animated:]_block_invoke.432;
    *(&var_-264 + 0x18) = ___block_descriptor_tmp.436;
    *(&var_-264 + 0x20) = rbx;
    r15 = var_-56;
    *(&var_-264 + 0x28) = [r15 retain];
    *(int8_t *)(&var_-264 + 0x30) = r12;
    [r13 animateAlongsideTransition:0x0 completion:&var_-264];
    [*(&var_-264 + 0x28) release];
    goto loc_2a05ba;

loc_2a03e8:
    if (([rbx _isTransitioning] == 0x0) && ([rbx needsDeferredTransition] == 0x0)) {
            r14 = var_-48;
            r15 = var_-56;
            (*(r14 + 0x10))(r14, r15, r12 & 0xff);
    }
    else {
            if (r12 != 0x0) {
                    var_-208 = __NSConcreteStackBlock;
                    *(&var_-208 + 0x8) = 0xc2000000;
                    *(&var_-208 + 0x10) = ___54-[UINavigationController setViewControllers:animated:]_block_invoke.443;
                    var_-64 = *_UIApp;
                    *(&var_-208 + 0x18) = ___block_descriptor_tmp.446;
                    r14 = var_-48;
                    *(&var_-208 + 0x20) = [r14 retain];
                    r15 = var_-56;
                    *(&var_-208 + 0x28) = [r15 retain];
                    *(int8_t *)(&var_-208 + 0x30) = r12;
                    [var_-64 _performBlockAfterCATransactionCommits:&var_-208];
                    [*(&var_-208 + 0x28) release];
                    [*(&var_-208 + 0x20) release];
            }
            else {
                    r14 = var_-48;
                    r15 = var_-56;
                    (*(r14 + 0x10))(r14, r15, r12 & 0xff);
            }
    }
    goto loc_2a05d6;
}
int ___54-[UINavigationController setViewControllers:animated:]_block_invoke(int arg0, int arg1, int arg2) {
    rbx = arg2;
    var_C0 = arg0;
    r15 = [arg1 retain];
    rax = __UIApplicationUsesLegacyUI();
    var_E0 = r15;
    var_B4 = rbx;
    if (rax == 0x0) goto loc_2a06a5;

loc_2a064b:
    var_C4 = 0x0;
    if (rbx == 0x0) goto loc_2a0806;

loc_2a065d:
    rbx = [[*(var_C0 + 0x20) mutableChildViewControllers] retain];
    rcx = r15;
    rax = [*(var_C0 + 0x20) _transitionForOldViewControllers:rbx newViewControllers:rcx];
    r15 = r15;
    goto loc_2a07f7;

loc_2a07f7:
    var_C4 = rax;
    [rbx release];
    goto loc_2a0806;

loc_2a0806:
    rbx = [r15 retain];
    r14 = [rbx count];
    if (r14 != 0x0) {
            var_D0 = 0x0;
            r13 = 0x0;
            var_100 = rbx;
            do {
                    r15 = r13;
                    r13 = r14;
                    r14 = r13 + 0xffffffffffffffff;
                    rdx = r14;
                    rax = [rbx objectAtIndex:rdx];
                    rax = [rax retain];
                    var_D8 = rax;
                    rsi = @selector(useLayoutToLayoutNavigationTransitions);
                    if (_objc_msgSend(rax, rsi) != 0x0) {
                            r13 = r15;
                            if (r13 != 0x0) {
                                    rsi = @selector(addIndex:);
                                    rdx = r14;
                                    _objc_msgSend(r13, rsi, rdx);
                            }
                            else {
                                    rbx = _objc_msgSend;
                                    r13 = [[NSMutableIndexSet indexSetWithIndex:r14] retain];
                                    rax = var_D0;
                                    if (rax != 0x0) {
                                            rsi = @selector(addObject:);
                                            rdx = r13;
                                            (rbx)(rax, rsi, rdx);
                                    }
                                    else {
                                            rsi = @selector(arrayWithObject:);
                                            rdx = r13;
                                            var_D0 = [(rbx)(@class(NSMutableArray), rsi, rdx) retain];
                                    }
                            }
                    }
                    else {
                            if (r15 != 0x0) {
                                    if ([var_D8 isKindOfClass:[UICollectionViewController class]] != 0x0) {
                                            rsi = @selector(addIndex:);
                                            rdx = r14;
                                            _objc_msgSend(r15, rsi, rdx);
                                    }
                                    else {
                                            rbx = [[var_100 objectAtIndex:r13] retain];
                                            rcx = 0x0;
                                            [rbx _setUseLayoutToLayoutNavigationTransitions:0x0 withCheck:rcx];
                                            rsi = @selector(addIndex:);
                                            rdx = r13;
                                            _objc_msgSend(r15, rsi, rdx);
                                            [rbx release];
                                    }
                                    [r15 release];
                                    r13 = 0x0;
                            }
                            else {
                                    r13 = 0x0;
                            }
                    }
                    [var_D8 release];
                    rbx = var_100;
            } while (r14 != 0x0);
            if (r13 != 0x0) {
                    r14 = [[rbx objectAtIndex:0x0] retain];
                    [r14 _setUseLayoutToLayoutNavigationTransitions:0x0 withCheck:0x0];
                    [r13 addIndex:0x0];
                    [r14 release];
                    [r13 release];
            }
            r15 = var_E0;
            r13 = var_D0;
    }
    else {
            r13 = 0x0;
    }
    r14 = var_B4;
    [rbx release];
    if (r13 != 0x0) {
            r12 = rbx;
            *(int128_t *)(&var_170 + 0x30) = intrinsic_movaps(*(int128_t *)(&var_170 + 0x30), 0x0);
            *(int128_t *)(&var_170 + 0x20) = intrinsic_movaps(*(int128_t *)(&var_170 + 0x20), 0x0);
            *(int128_t *)(&var_170 + 0x10) = intrinsic_movaps(*(int128_t *)(&var_170 + 0x10), 0x0);
            var_170 = intrinsic_movaps(var_170, 0x0);
            var_D0 = r13;
            rax = [r13 retain];
            var_D8 = rax;
            r14 = [rax countByEnumeratingWithState:&var_170 objects:&var_B0 count:0x10];
            if (r14 != 0x0) {
                    r13 = **(&var_170 + 0x10);
                    do {
                            rbx = 0x0;
                            do {
                                    if (*var_160 != r13) {
                                            objc_enumerationMutation(var_D8);
                                    }
                                    [*(var_C0 + 0x20) _prepareCollectionViewControllers:r12 forSharingInRange:*(var_168 + rbx * 0x8)];
                                    rbx = rbx + 0x1;
                            } while (rbx < r14);
                            r14 = [var_D8 countByEnumeratingWithState:&var_170 objects:&var_B0 count:0x10];
                    } while (r14 != 0x0);
            }
            [var_D8 release];
            r15 = var_E0;
            r14 = var_B4;
            rbx = r12;
            r13 = var_D0;
    }
    [*(var_C0 + 0x20) _setViewControllers:rbx transition:var_C4 animated:r14 & 0xff];
    [r13 release];
    goto loc_2a0c1a;

loc_2a0c1a:
    [r15 release];
    rax = *___stack_chk_guard;
    if (rax != *___stack_chk_guard) {
            rax = __stack_chk_fail();
    }
    return rax;

loc_2a06a5:
    if (r15 == 0x0) goto loc_2a06ff;

loc_2a06aa:
    r13 = r15;
    rbx = [[*(var_C0 + 0x20) mutableChildViewControllers] retain];
    r15 = [r13 isEqualToArray:rbx];
    [rbx release];
    COND = r15 == 0x0;
    r15 = r13;
    if (COND) goto loc_2a07b8;

loc_2a06ff:
    if ([r15 count] == 0x0) goto loc_2a07ae;

loc_2a0718:
    r15 = [[var_E0 lastObject] retain];
    r12 = [[r15 view] retain];
    rbx = [[*(var_C0 + 0x20) view] retain];
    r14 = [r12 isDescendantOfView:rbx];
    [rbx release];
    [r12 release];
    [r15 release];
    r15 = var_E0;
    if (r14 != 0x0) goto loc_2a0c1a;

loc_2a07ae:
    r13 = r15;
    goto loc_2a07b8;

loc_2a07b8:
    rbx = [[*(var_C0 + 0x20) mutableChildViewControllers] retain];
    r15 = r13;
    rcx = r15;
    rax = [*(var_C0 + 0x20) _transitionForOldViewControllers:rbx newViewControllers:rcx];
    goto loc_2a07f7;
}
int -[UINavigationController _transitionForOldViewControllers:newViewControllers:](void * self, void * _cmd, void * arg2, void * arg3) {
    r14 = self;
    var_30 = [arg2 retain];
    rbx = @selector(lastObject);
    r15 = [_objc_msgSend(arg3, rbx) retain];
    r12 = [r14 isMemberOfClass:[UINavigationController class]];
    r13 = [[r15 _existingView] retain];
    if (*(int32_t *)__UIApplicationLinkedOnVersion != 0x0) {
            if (*(int32_t *)__UIApplicationLinkedOnVersion <= 0x8ffff) {
                    if (r13 != 0x0) {
                            r12 = r12 ^ 0x1;
                            if (r12 != 0x0) {
                                    [r14 loadViewIfNeeded];
                                    if ([r14 isViewLoaded] != 0x0) {
                                            rbx = [[r14 view] retain];
                                            r12 = [r13 isDescendantOfView:rbx];
                                            rdi = rbx;
                                            rbx = @selector(lastObject);
                                            [rdi release];
                                    }
                                    else {
                                            r12 = 0x0;
                                    }
                            }
                            else {
                                    if (r13 != 0x0) {
                                            if ([r14 isViewLoaded] != 0x0) {
                                                    rbx = [[r14 view] retain];
                                                    r12 = [r13 isDescendantOfView:rbx];
                                                    rdi = rbx;
                                                    rbx = @selector(lastObject);
                                                    [rdi release];
                                            }
                                            else {
                                                    r12 = 0x0;
                                            }
                                    }
                                    else {
                                            r12 = 0x0;
                                    }
                            }
                    }
                    else {
                            if (r13 != 0x0) {
                                    if ([r14 isViewLoaded] != 0x0) {
                                            rbx = [[r14 view] retain];
                                            r12 = [r13 isDescendantOfView:rbx];
                                            rdi = rbx;
                                            rbx = @selector(lastObject);
                                            [rdi release];
                                    }
                                    else {
                                            r12 = 0x0;
                                    }
                            }
                            else {
                                    r12 = 0x0;
                            }
                    }
            }
            else {
                    if (r13 != 0x0) {
                            if ([r14 isViewLoaded] != 0x0) {
                                    rbx = [[r14 view] retain];
                                    r12 = [r13 isDescendantOfView:rbx];
                                    rdi = rbx;
                                    rbx = @selector(lastObject);
                                    [rdi release];
                            }
                            else {
                                    r12 = 0x0;
                            }
                    }
                    else {
                            r12 = 0x0;
                    }
            }
    }
    else {
            if (__UIApplicationLinkedOnOrAfter(0x90000) != 0x0) {
                    if (r13 != 0x0) {
                            if ([r14 isViewLoaded] != 0x0) {
                                    rbx = [[r14 view] retain];
                                    r12 = [r13 isDescendantOfView:rbx];
                                    rdi = rbx;
                                    rbx = @selector(lastObject);
                                    [rdi release];
                            }
                            else {
                                    r12 = 0x0;
                            }
                    }
                    else {
                            r12 = 0x0;
                    }
            }
            else {
                    if (r13 != 0x0) {
                            r12 = r12 ^ 0x1;
                            if (r12 != 0x0) {
                                    [r14 loadViewIfNeeded];
                                    if ([r14 isViewLoaded] != 0x0) {
                                            rbx = [[r14 view] retain];
                                            r12 = [r13 isDescendantOfView:rbx];
                                            rdi = rbx;
                                            rbx = @selector(lastObject);
                                            [rdi release];
                                    }
                                    else {
                                            r12 = 0x0;
                                    }
                            }
                            else {
                                    if (r13 != 0x0) {
                                            if ([r14 isViewLoaded] != 0x0) {
                                                    rbx = [[r14 view] retain];
                                                    r12 = [r13 isDescendantOfView:rbx];
                                                    rdi = rbx;
                                                    rbx = @selector(lastObject);
                                                    [rdi release];
                                            }
                                            else {
                                                    r12 = 0x0;
                                            }
                                    }
                                    else {
                                            r12 = 0x0;
                                    }
                            }
                    }
                    else {
                            if (r13 != 0x0) {
                                    if ([r14 isViewLoaded] != 0x0) {
                                            rbx = [[r14 view] retain];
                                            r12 = [r13 isDescendantOfView:rbx];
                                            rdi = rbx;
                                            rbx = @selector(lastObject);
                                            [rdi release];
                                    }
                                    else {
                                            r12 = 0x0;
                                    }
                            }
                            else {
                                    r12 = 0x0;
                            }
                    }
            }
    }
    r14 = [_objc_msgSend(var_30, rbx) retain];
    [r14 release];
    if (r12 != 0x0) {
            rbx = 0x0;
            if (r15 != r14) {
                    rbx = 0x2 - ((r12 | [var_30 containsObject:r15] ^ 0x1) & 0xff);
            }
    }
    else {
            rbx = 0x2 - ((r12 | [var_30 containsObject:r15] ^ 0x1) & 0xff);
    }
    [r13 release];
    [r15 release];
    [var_30 release];
    rax = rbx;
    return rax;
}
bool -[UINavigationController _transitionConflictsWithNavigationTransitions:](void * self, void * _cmd, void * arg2) {
    r14 = self;
    r15 = [arg2 retain];
    if ((([r15 presentationStyle] != 0x4) && ([r15 presentationStyle] != 0x3)) && ([r15 presentationStyle] != 0x6)) {
            rbx = 0x0;
    }
    else {
            r13 = [[r15 viewControllerForKey:@"UITransitionContextToViewController"] retain];
            if (r13 == 0x0) {
                    if ([r15 presentationStyle] == 0x4) {
                            rax = [r15 viewControllerForKey:@"UITransitionContextFromViewController"];
                            rax = [rax retain];
                            rbx = rax != 0x0 ? 0x1 : 0x0;
                            rdi = rax;
                    }
                    else {
                            var_50 = __NSConcreteStackBlock;
                            *(&var_50 + 0x8) = 0xc2000000;
                            *(&var_50 + 0x10) = ___72-[UINavigationController _transitionConflictsWithNavigationTransitions:]_block_invoke;
                            *(&var_50 + 0x18) = ___block_descriptor_tmp.2175;
                            *(&var_50 + 0x20) = [r13 retain];
                            rbx = [r14 _doesSelfOrAncestorPassPredicate:&var_50] ^ 0x1;
                            rdi = *(&var_50 + 0x20);
                    }
            }
            else {
                    var_50 = __NSConcreteStackBlock;
                    *(&var_50 + 0x8) = 0xc2000000;
                    *(&var_50 + 0x10) = ___72-[UINavigationController _transitionConflictsWithNavigationTransitions:]_block_invoke;
                    *(&var_50 + 0x18) = ___block_descriptor_tmp.2175;
                    *(&var_50 + 0x20) = [r13 retain];
                    rbx = [r14 _doesSelfOrAncestorPassPredicate:&var_50] ^ 0x1;
                    rdi = *(&var_50 + 0x20);
            }
            [rdi release];
            [r13 release];
    }
    [r15 release];
    rax = rbx;
    return rax;
}

 

void -[UINavigationController _setViewControllers:transition:animated:](void * self, void * _cmd, void * arg2, int arg3, bool arg4) {

    [self _setViewControllers:arg2 transition:arg3 animated:arg4 operation:0x3];

    return;

}

 

 

 

設置個控制器寫這麼多代碼,當然立刻生效不了了😂😂😂

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章