尝试从 UIView 的按钮转移到另一个 ViewController 时,委托不起作用

Posted

技术标签:

【中文标题】尝试从 UIView 的按钮转移到另一个 ViewController 时,委托不起作用【英文标题】:Delegate doesn't work when trying to segue from UIView's button to another ViewController 【发布时间】:2017-08-01 06:25:08 【问题描述】:

我正在尝试以编程方式转到另一个故事板上的视图控制器。

提供更多细节;我的 xib 上有一个 UILabel 和 UIButton,其中 UILabel 包含一个“Lorem ipsum”,并且按钮的类型已更改为自定义,因此它可以是透明的。我已将按钮的大小设置为覆盖所有 xib 文件。因此,当用户点击按钮时,我可以在该按钮的操作中创建一个 segue。

我知道我不能直接这样做,所以我必须有一个委托方法,该方法将从我的 xib 的父视图控制器调用。当我运行我的项目时,它不断陷入 Mini.m 文件的 btnClick 操作的 else 块中。

我还进行了一些搜索并阅读了一些以前关于 SO 的帖子,例如以下链接,但不知何故无法解决问题。有什么想法我在这里缺少什么吗?

https://***.com/a/35583877/1450201

https://***.com/a/6169104/1450201

https://***.com/a/30508168/1450201

https://***.com/a/10520042/1450201

迷你.h

#import <UIKit/UIKit.h>

@protocol SelectionProtocol;

@interface Mini : UIView

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

- (IBAction)btnClick:(id)sender;

@end


@protocol SelectionProtocol <NSObject>

@required
-(void) isClicked;

@end

最小.m

#import "Mini.h"

@implementation Mini

- (instancetype)initWithCoder:(NSCoder *)aDecoder 
    if (self = [super initWithCoder:aDecoder]) 
        [self load];
    

    return self;



- (instancetype)initWithFrame:(CGRect)frame 
    if (self = [super initWithFrame:frame]) 
        [self load];
    
    return self;


- (void)load 
    UIView *view = [[[NSBundle bundleForClass:[self class]] loadNibNamed:@"Mini" owner:self options:nil] firstObject];
    [self addSubview:view];
    view.frame = self.bounds;

    //    ui component properties will be set here


- (IBAction)btnClick:(id)sender 

    if (self.delegate && [self.delegate respondsToSelector:@selector(isClicked)]) 
        [self.delegate isClicked];
     else 
        NSLog(@"AAAAAAAAAAAAAA");
    


@end

ViewController.h

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

@interface ViewController : UIViewController <SelectionProtocol>

@end

ViewController.m

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad 
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.



-(void) isClicked 
    UIStoryboard *targetStoryBoard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
    UIViewController *targetVC = (UIViewController *)[targetStoryBoard instantiateViewControllerWithIdentifier:@"SecondViewController"];
    [self.navigationController pushViewController:targetVC animated:YES];


- (void)didReceiveMemoryWarning 
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.


@end

编辑:我将 UIView 用作 UIViewCotnroller 的子视图。这是一个截图


编辑 2: 我最新更改的屏幕截图:(仍然无法导航到 SecondViewController)

【问题讨论】:

您在哪里将您的ViewController 设置为您视图的delegate 那么我的 ViewController.h 文件中是否缺少某些内容?我以为我在那里所做的是将它设置为视图的代表 ViewController.h 文件中,你只是说这个类实现了SelectionProtocol,但你并没有告诉Mini 类的实例这个ViewController 是它的delegate。跨度> 哦..好吧,我该怎么做? 此视图是ViewController 的子视图吗?提供更多有关您的问题的上下文。例如,你什么时候在屏幕上显示这个视图? 【参考方案1】:

像这样设置委托

在 ViewController.m 中

- (void)viewDidLoad 

[super viewDidLoad];

Mini *view = [[Mini alloc]init];
 view.delegate = self;
// Do any additional setup after loading the view, typically from a nib.

【讨论】:

它没有用。仍然落入 Mini.m 文件的 btnClick 动作的 else 块中 使用这个 if (self.delegate && [self.delegate respondsToSelector:@selector(ViewController.isClicked)]) 很抱歉,您的意思是什么?我应该把它改成什么?我在 if 块中使用它,但不知何故它一直落入 else 块 更新此方法 - (IBAction)btnClick:(id)sender if (self.delegate && [self.delegate respondsToSelector:@selector(ViewController.isClicked)]) [self.delegate isClicked] ; 其他 NSLog(@"AAAAAAAAAAAAAAAA"); 它想在 ViewController.isClicked 的点之前添加分号“:”而不是给出错误【参考方案2】:

您没有将ViewController 设置为Mini 视图的delegate。我假设Mini 视图是ViewController 的子视图。您需要做的就是在ViewController 类中创建此视图的引用/指针,并将其设置为视图的delegate

    创建视图的出口并将其与故事板中放置的视图连接起来。不要忘记在 Xcode 的身份检查器中将此视图的类更改为 Mini

    #import "Mini.h"
    
    @interface ViewController : UIViewController <SelectionProtocol>
        @property (weak, nonatomic) IBOutlet Mini *miniView;
    @end
    

    viewDidLoad中设置这个视图的delegate

    - (void)viewDidLoad 
        [super viewDidLoad];
        self.miniView.delegate = self;
    
    

【讨论】:

快速提问,你有没有发现其他奇怪的地方?我确实尝试了您的解决方案,但无法导航到第二个 vc 您是否将IBOutlet 与故事板中放置的视图连接起来?还要在身份检查器中将此视图的类更改为Mini 我创建了一个视图组件的出口,放置在我的 viewcontroller 到 ViewController.h 文件中,然后在 viewDidLoad 中调用 在我的问题末尾添加了 3 张截图 Here's 一个关于如何将 IBOutlet 连接到故事板的短视频。【参考方案3】:

您应该指定一个符合协议的实例作为委托。object.delegate = self

【讨论】:

以上是关于尝试从 UIView 的按钮转移到另一个 ViewController 时,委托不起作用的主要内容,如果未能解决你的问题,请参考以下文章

将 UIView 从一个选项卡移动到另一个选项卡

如何使用 segue 从 UIView 导航到 UIView 控制器?

从一个 UIView 到另一个 UIView 的平滑过渡

从一个视图中删除一个视图并将其添加到另一个视图

如何将状态从一个组件转移到另一个?

当我尝试将handel事件从表单转移到另一个时出错