【问题标题】:Pass boolean trough back button of navigationBar通过导航栏的后退按钮传递布尔值
【发布时间】:2012-12-12 09:39:07
【问题描述】:

我有两个viewController,viewControllerB,当通过navigationBar的后退按钮返回viewControllerA时,我要你传递一个布尔值。我使用了协议,但不起作用。

在 ViewControllerB.h 中

 @protocol detailProgrammFiereDelegate <NSObject>
 @required
 -(void) addItemViewController: (ViewControllerB *)programmFiere withBool:(BOOL)booleanFiere;
 @end

 .....
 @property (nonatomic, weak)id <detailProgrammFiereDelegate>delegate;
 .......

在 ViewControllerB.m 中

- (void)viewDidLoad
{
     ......

     BOOL booleanFiere =YES;
    [self.delegate addItemViewController:self withBool:booleanFiere];
 }

在 ViewControllerA.h 中

@interface ViewControllerA: UIViewController <detailProgrammFiereDelegate>

在 ViewControllerA.m 中

-(void)addItemViewController:(DetailProgrammFiere *)programmFiere withBool:(BOOL)booleanFiere{

     //after pressing back button of viewControllerB not enter into this method. Why?

    if (booleanFiere){ //is already true before opening the ViewControllerB. Why?
        [self viewDidLoad];
    }
}
........

 -(void)getInformationsFiere:(id)sender{ //method that open ViewControllerB

     ViewControllerB * detailFiere =[[ViewControllerB alloc]initWithNibName:@"ViewControllerB~iPhone" bundle:nil];


    detailFiere.delegate =self;


    [self.navigationController pushViewController:detailFiere animated:YES];

   }

在打开 ViewControllerB 之前布尔值已经为真,这不应该发生。

【问题讨论】:

    标签: ios delegates protocols parameter-passing


    【解决方案1】:

    如果要在从B返回A时传递参数,则不应将调用委托方法放在viewDidLoad中。 B 的 viewDidLoad 在 B 是 alloc 和 init 的时候会被调用,但是当 B 被 pop B 返回到 A 时不会被调用。这也是为什么在 B 出现之前,A 的 booleanFiere 已经是 YES 的原因。

    你可以放

        [self.delegate addItemViewController:self withBool:booleanFiere];
    

    就在 B 的 [self.navigationController popViewControllerAnimated:YES] 之前,而不是在 B 的 viewDidLoad 中。所以A的-addItemViewController:会在返回的时候调用

    【讨论】:

    • 那么如果我不把它放在viewDidLoad中,我一定要创建一个方法一个目的吗?在哪里?
    • 如果没有其他方法可以返回viewController A(也就是说只能用返回键返回),可以放在B的-viewWillDisappear:-(void) viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; [self.delegate addItemViewController:self withBool:booleanFiere]; }
    • 如何防止布尔值已经是viewControllerB的第一个打开?
    • 不要调用 [self.delegate addItemViewController:self withBool:booleanFiere];在 B 的 viewDidLoad 中。
    猜你喜欢
    • 1970-01-01
    • 2023-03-16
    • 2014-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-25
    • 2013-12-05
    • 2016-03-09
    相关资源
    最近更新 更多