在viewWillDisappear中控制委托方法调用

时间:2014-03-29 22:12:20

标签: ios objective-c controller

我有3个控制器,如我的3个控制器是ControllerA,ControllerB和ControllerC。

 - ControllerA navigates to ControllerB.
 - ControllerB can navigate to ControllerA (using Back Button) and can navigate to ControllerC.
 - ControllerC can navigate to ControllerB.

我在ControllerB中有一个协议和委托,它的实现在ControllerA中。

ControllerB.h

@protocol ControllerBDelegate <NSObject>
- (void)someMethod;
@end

ControllerB.m

- (void)viewWillDisappear:(BOOL)animated
{
    [super viewWillDisappear:animated];
    [self.delegate someMethod];
}

- (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
   ControllerC *controllerC = [[ControllerC alloc] init];
   [controllerC navigateToView];
}

ControllerA.h

@interface ControllerB : UITableViewController <ControllerADelegate>
@end

ControllerA.m

- (void)someMethod
{
  // Some method and its implementation logic.
}

问题: 的 当我单击ControllerB上的Back按钮时,将调用viewWillDisappear,它会根据需要执行ControllerA中定义的'someMethod()'内的逻辑。但是当我单击一个单元格导航到ControllerC时,由于ControllerB正在消失,这次它调用viewWillDisappear并执行ControllerA中定义的'someMethod()'内部的逻辑,然后导航到ControllerC。

有没有办法可以避免执行或在ControllerB中使用viewWillDisappear,以避免在导航到ControllerC时调用someMethod()。简而言之,当我导航到ControllerC时,我不希望ControllerB调用并执行someMethod()。

2 个答案:

答案 0 :(得分:0)

创建名为BOOL isNavigating

的实例变量

isNavigating = YES;方法上设置- (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath

您的viewWillDisappear方法应该是这样的:

- (void)viewWillDisappear:(BOOL)animated
{
    [super viewWillDisappear:animated];
    if (!isNavigating) {
        [self.delegate someMethod];
    }
}

请务必在isNavigating = NO;方法上设置viewWillAppear

答案 1 :(得分:0)

您无法避免调用viewWillDisappear - 这是标准视图生命周期的一部分。您可以用自己的控制器替换ControllerB中的标准后退按钮,并为它建立一个事件处理程序。此事件处理程序可以触发委托方法并弹出视图。

在viewDidLoad方法中 -

UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle @"Back" style: UIBarButtonItemStylePlain  target:self action:@selector(goBack:)];

self.navigationItem.leftBarButtonItem = backButton;

然后添加您的操作方法 -

- (void)goBack:(id)sender
{
   if (self.delegate != nil)
   {
     [self.delegate someMethod];
   }

   [self.navigationController popViewControllerAnimated:YES];

}

另一种方法是使用故事板和segues。然后,您可以在prepareForSegue

中执行适当的处​​理