如何在目标C中调用另一个使用self的类的方法

时间:2016-12-15 06:50:51

标签: ios iphone methods call

下面的RKSwipeBetweenViewControllers类(Github库在控制器之间滑动)它还提供了一个选项,我可以点击按钮(这是viewControllers的名称)我如何在我的每个viewcontroller中实现下一个按钮,这样如果一个用户不知道他可以滑动他只需点击下一步按钮即可转到下一个控制器:

   -(void)setupSegmentButtons {
    navigationView = [[UIView alloc]initWithFrame:CGRectMake(0,0,self.view.frame.size.width,self.navigationBar.frame.size.height)];


    NSInteger numControllers = [viewControllerArray count];

    if (!buttonText) {
         buttonText = [[NSArray alloc]initWithObjects: @"Login",@"Personal",@"Contact",@"Club Info",nil]; //%%%buttontitle
    }

    for (int i = 0; i<numControllers; i++) {

        RKButton = [[UIButton alloc]initWithFrame:CGRectMake(X_BUFFER+i*(self.view.frame.size.width-2*X_BUFFER)/numControllers-X_OFFSET, Y_BUFFER, (self.view.frame.size.width-2*X_BUFFER)/numControllers, HEIGHT)];

        [navigationView addSubview:RKButton];

        RKButton.tag = i; //%%% IMPORTANT: if you make your own custom buttons, you have to tag them appropriately

        [RKButton setBackgroundColor:ThemeColor];//%%% buttoncolors

        [RKButton addTarget:self action:@selector(tapSegmentButtonAction:) forControlEvents:UIControlEventTouchUpInside];

        //[RKButton addTarget:self action:@selector(CalltapSegmentButtonAction) forControlEvents:UIControlEventTouchUpInside];

        [RKButton setTitle:[buttonText objectAtIndex:i] forState:UIControlStateNormal]; //%%%buttontitle

        [_RKSwipeRegisterModal.RKButtonArray addObject:RKButton];

        NSLog(@"_RKSwipeRegisterModal.RKButtonArray %@",_RKSwipeRegisterModal.RKButtonArray);

    }

    pageController.navigationController.navigationBar.topItem.titleView = navigationView;


    [self setupSelector];
}

,选择器方法如下:

-(void)tapSegmentButtonAction:(UIButton *)RKButton {

    if (!self.isPageScrollingFlag) {

        NSInteger tempIndex = self.currentPageIndex;

        __weak typeof(self) weakSelf = self;

        //%%% check to see if you're going left -> right or right -> left
        if (RKButton.tag > tempIndex) {

            //%%% scroll through all the objects between the two points
            for (int i = (int)tempIndex+1; i<=RKButton.tag; i++) {
                [pageController setViewControllers:@[[viewControllerArray objectAtIndex:i]] direction:UIPageViewControllerNavigationDirectionForward animated:YES completion:^(BOOL complete){

                    //%%% if the action finishes scrolling (i.e. the user doesn't stop it in the middle),
                    //then it updates the page that it's currently on
                    if (complete) {



                        [weakSelf updateCurrentPageIndex:i];
                    }
                }];
            }
        }

        //%%% this is the same thing but for going right -> left
        else if (RKButton.tag < tempIndex) {
            __weak typeof(self) kjhg = self;
            for (int i = (int)tempIndex-1; i >= RKButton.tag; i--) {
                [pageController setViewControllers:@[[viewControllerArray objectAtIndex:i]] direction:UIPageViewControllerNavigationDirectionReverse animated:YES completion:^(BOOL complete){
                    if (complete) {

                        [weakSelf updateCurrentPageIndex:i];
                    }
                }];
            }
        }
    }
}

现在我创建了一个在上面的方法中创建的全局按钮数组,并将其传递给另一个类的下面的代码。

现在我想使用下面的代码从头等方调用上面的方法:

-(void)callMethodOfSecondClass {

        UIButton *button = [globalArrayOfButtons objectAtIndex:1];

        [rkSwipeControllrObject tapSegmentButtonAction:button];

    }

现在问题显然是self.currentPageIndex在第二类中为零。

我如何赋予它原始早期自我的价值。

请帮助

1 个答案:

答案 0 :(得分:0)

  

现在问题显然是self.currentPageIndex在第二个是零   类。

     

我如何赋予它原始早期自我的价值。

你做不到。 self始终引用拥有正在执行的方法的对象。如果self.currentPageIndexnil,那是因为您发送消息methodOfSecondClass:的对象的nil属性为currentPageIndex

很难看到您的代码中发生了什么,因为尽管您声称相反,-callMethodOfSecondClass:方法实际上并未调用-methodOfSecondClass:。你能确定你提供了展示问题的真实代码吗?

一个可能的问题是你遇到了一个错误的身份。您可能有两个(或更多!)SecondClass个实例,其中您知道其中一个currentPageIndex有效,但是您将-methodOfSecondClass :消息发送到与另一个实例不同的实例你期待。

  

'currentPageIndex'在第二类中不是nil,它只是nil时   它是从另一个类调用的。我知道什么时候我是rkSwipeControllr   = [SecondClass new];'它需要新的内存,'currentPageIndex'应该是'nil'。但有没有办法分配它   相同的内存地址

当您说rkSwipeControllr = [SecondClass new]时,rkSwipeControllr会获取SecondClass实例的地址,与之前创建的任何内容完全分开。

我认为你会从考虑类和该类实例之间的差异中受益。类SecondClass定义了对象的,但类本身并不存储您感兴趣的信息,如currentPageIndex。要使用该类,您必须创建该类的实例,即 type SecondClass的对象。

这就像 Ford F-150 之间的区别,它是皮卡的 ios_Dev的 福特F-150 ,这是一辆真正的卡车(或者如果你驾驶的是F-150)。假设我去经销商买了一架F-150,然后把它停在我的车道上,把电锯放在后面。那天晚些时候,当我需要我的电锯时,我必须去那辆特定的卡车才能拿到它。如果我转而去经销商并购买另一架F-150,我无法合理地期望在后面找到我的电锯,对吗?因此,对于SecondClass的实例 - 如果您创建SecondClass的新实例并将其设置为currentPageIndex,则需要使用该相同的对象你希望得到currentPageIndex值。为此,您需要在创建对象时保留强引用。如果您没有至少一个对该对象的强引用,那么 nobody 将记住该对象的位置,而Objective-C运行时将有助于销毁该对象。保留该强引用的一种方法是在对象中标记为strong的属性中,该属性稍后需要引用该对象。