尝试从 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 时,委托不起作用的主要内容,如果未能解决你的问题,请参考以下文章