我有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()。
答案 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