0

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

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

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

在此处输入图像描述

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

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

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

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

https://stackoverflow.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

最小米

#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

视图控制器.h

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

@interface ViewController : UIViewController <SelectionProtocol>

@end

视图控制器.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) 在此处输入图像描述

在此处输入图像描述

在此处输入图像描述

4

3 回答 3

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.
}
于 2017-08-01T06:55:08.410 回答
1

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

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

    #import "Mini.h"
    
    @interface ViewController : UIViewController <SelectionProtocol>
        @property (weak, nonatomic) IBOutlet Mini *miniView;
    @end
    
  2. 在这个视图的viewDidLoad集合中delegate

    - (void)viewDidLoad {
        [super viewDidLoad];
        self.miniView.delegate = self;
    }
    
于 2017-08-01T06:55:46.900 回答
0

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

于 2017-08-01T07:48:11.233 回答