【问题标题】:ios click back button pass value can't find selectorios单击返回按钮传递值找不到选择器
【发布时间】:2014-08-05 00:47:22
【问题描述】:

我正在测试代码,我构建了两个 uiviewcontroller ,A , B 并使用导航。

当我点击 A Button 时,它将导航到 B UIviewController。

但是我需要点击导航栏上的返回按钮,它会传递一个值返回给A uiviewcontroller。

但是当我点击返回按钮时没有找到选择器。日志仍然显示 0。

我的 AViewController 标头如下:

    #import <UIKit/UIKit.h>
    #import "BViewController.h"

    @interface AViewController : UIViewController<BViewControllerDelegate>

    -(void) bViewController:(BViewController *)childViewController sendBackPassValue:(NSString *)value;

    @end

AViewController 实现文件如下:

    #import "BViewController.h"
    ...
    -(void) bViewController:(BViewController *)childViewController sendBackPassValue:(NSString *)value
    {

        NSLog(@"Back Value: %@", value );
    }
    ...

B View Controller 头文件如下:

    #import <UIKit/UIKit.h>
    @class BViewController;

    @protocol BViewControllerDelegate <NSObject>

    -(void) bViewController:(BViewController*) childViewController sendBackPassValue:(NSString*) value;

    end


    @interface BViewController : UIViewController

    @property (strong,nonatomic) NSString *passValue;
    @property (weak, nonatomic) id<BViewControllerDelegate> delegate;

    @end

B 视图控制器实现文件如下: #import "BViewController.h" #import "AViewController.h"

    ...
    - (void)viewDidLoad
    {
        [super viewDidLoad];

        _passValue = @"my pass value";

        UIBarButtonItem *newBackButton = [[UIBarButtonItem alloc] initWithTitle:@"Home"         style:UIBarButtonItemStyleBordered target:self action:@selector(home:)];
        self.navigationItem.leftBarButtonItem=newBackButton;
    }

    -(void)home:(UIBarButtonItem *)sender {

        NSLog(@"home button click");
        NSLog(@"[_delegate respondsToSelector:@selector(bViewController:sendBackDateTime:)]:%d",[_delegate respondsToSelector:@selector(bViewController:sendBackPassValue:)]);

        if( [_delegate respondsToSelector:@selector(bViewController:sendBackPassValue:)])
        {
            NSLog(@"sendBackPassValue");
            [_delegate bViewController:self sendBackPassValue:_passValue];
        }

        [self.navigationController popToRootViewControllerAnimated:YES];

    }
    ...

但是

    NSLog(@"[_delegate respondsToSelector:@selector(bViewController:sendBackDateTime:)]:%d",[_delegate respondsToSelector:@selector(bViewController:sendBackPassValue:)]);

仍然是 0。

有谁知道我少了哪一步?

非常感谢。

--回答--

在 AUIViewcontroller.m 中添加此代码

它可以触发委托。

    -(void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
    {
        BViewController *nextVC = segue.destinationViewController;
        nextVC.delegate = self;
    }

【问题讨论】:

  • A创建B时,是否设置delegate属性?贴出 A 创建并显示 B 的代码。
  • 对不起,我忘记提交代码了。我已经更新了 git。谢谢
  • 你没有回答我的问题。您是否设置了delegate 属性?使用创建和显示 B 控制器的代码更新您的问题。不要让人们在其他地方访问您的代码。它属于问题。
  • 谢谢 rmaddy。我解决问题。设置一个 Viewcontroller 委托,它可以显示日志值 1。

标签: ios xcode navigation


【解决方案1】:

试试这个:

-(void) viewWillDisappear:(BOOL)animated {
if ([self.navigationController.viewControllers indexOfObject:self]==NSNotFound) {
   // back button was pressed.  We know this is true because self is no longer
   // in the navigation stack.  
}
[super viewWillDisappear:animated];

}

来源:Setting action for back button in navigation controller

【讨论】:

  • 这与问题有什么关系?还有 FTI - 有更好的方法来查看视图控制器是否被关闭。
  • 此条件确认用户是否按下了返回按钮,因此他可以将值传递给 A 控制器。
  • 你的回答不是问题的内容。 OP 有自己的按钮。问题在于调用委托方法。阅读问题中的代码。
【解决方案2】:

在 AUIViewcontroller.m 中添加此代码

它可以触发委托。

-(void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    BViewController *nextVC = segue.destinationViewController;
    nextVC.delegate = self;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-15
    • 2013-08-26
    • 2016-01-11
    • 2014-03-26
    • 1970-01-01
    相关资源
    最近更新 更多