Делегат не работает при попытке перейти от кнопки UIView к другому ViewController

Я пытаюсь программно перейти к контроллеру представления, который находится на другой раскадровке.

Чтобы дать больше деталей; У меня есть UILabel и UIButton на моей xib, где UILabel содержит "Lorem ipsum", а тип кнопки изменился, так что он может быть прозрачным. Я установил размер кнопки, чтобы покрыть весь файл XIB. Поэтому, когда пользователь нажимает на кнопку, я могу создать переход в действии этой кнопки.

Я знаю, что не могу сделать это напрямую, поэтому у меня должен быть метод делегата, который будет вызываться из родительского viewcontroller моей xib. Когда я запускаю свой проект, он продолжает попадать в блок else действия btnClick файла Mini.m.

Я также провел некоторый поиск и прочитал несколько предыдущих постов на SO, например, следующие ссылки, но каким-то образом не смог решить проблему. Есть идеи, что мне здесь не хватает?

/questions/46029194/vyipolnit-perehod-ot-xib-k-viewcontoller/46029202#46029202

/questions/37981504/kak-nastroit-prostoj-delegat-dlya-svyazi-mezhdu-dvumya-kontrollerami-predstavleniya/37981520#37981520

/questions/34963855/kak-sozdat-protokol-s-metodami-kotoryie-yavlyayutsya-neobyazatelnyimi/34963870#34963870

/questions/32358939/kak-vyizvat-delegat-metod-iphone/32358954#32358954

Mini.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

Mini.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)

3 ответа

Решение

Просто установите делегат так

В 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.
}

Вы не устанавливаете ViewController как delegate из Mini Посмотреть. Я предполагаю, что Mini представление является подпредставлением ViewController, Все, что вам нужно сделать, это создать ссылку / указатель этого представления в ViewController класс и установить его как delegate зрения.

  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;
    }
    

Вы должны указать в качестве делегата экземпляр, который соответствует протоколу.object.delegate = self,

Другие вопросы по тегам