Делегат не работает при попытке перейти от кнопки 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/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
зрения.
Создайте выход вашего представления и соедините его с представлением, помещенным в раскадровку. Не забудьте изменить класс этого представления на
Mini
в инспекторе идентичности XCode#import "Mini.h" @interface ViewController : UIViewController <SelectionProtocol> @property (weak, nonatomic) IBOutlet Mini *miniView; @end
в
viewDidLoad
установитьdelegate
этого взгляда- (void)viewDidLoad { [super viewDidLoad]; self.miniView.delegate = self; }
Вы должны указать в качестве делегата экземпляр, который соответствует протоколу.object.delegate = self
,