У меня есть viewcontroller name как viewcontroller1. Я перетащил uiview в этот диспетчер view и добавил некоторые кнопки для этого представления с действиями. Кроме того, для этого uiview создается пользовательский класс представления. Этот uiview действует как верхняя панель для viewcontroller1. У меня есть еще несколько контроллеров view, и я использую тот же uiview для этих контроллеров view, получая uiview, используя метод viewwithtag. Но делегаты не работают, когда я использую этот метод. Я получаю thread1 exc_bad доступ, когда делегаты вызываются из класса uiview. Любая помощь приветствуется. Это мой UIView классsingle uiview для многих viewcontrollers
//topview.h
@protocol buttonprotocol <NSObject>
-(void) button1pressed;
-(void) button2pressed;
@end
#import <UIKit/UIKit.h>
@interface topview : UIView
- (IBAction)button1action:(id)sender;
- (IBAction)button2action:(id)sender;
@property (nonatomic,assign) id <buttonprotocol> delegate;
@property (weak, nonatomic) IBOutlet UIButton *button1;
@property (weak, nonatomic) IBOutlet UIButton *button2;
@end
//topview.m
#import "topview.h"
@implementation topview
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
// Initialization code
}
return self;
}
/*
// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
- (void)drawRect:(CGRect)rect
{
// Drawing code
}
*/
- (IBAction)button1action:(id)sender
{
[self.delegate button1pressed];
}
- (IBAction)button2action:(id)sender
{
[self.delegate button2pressed];
}
@end
Данный ниже является первым ViewController
// ViewController.h
#import <UIKit/UIKit.h>
#import "topview.h"
#import "button1ViewController.h"
#import "button2ViewController.h"
@interface ViewController : UIViewController
<buttonprotocol>
@property (weak, nonatomic) IBOutlet topview *topviewobj;
@end
// ViewController.m
#import "ViewController.h"
@interface ViewController()
@end
@implementation ViewController
- (void)viewDidLoad
{
[super viewDidLoad];
_topviewobj.delegate=self;
UIView *newview=[[UIView alloc]initWithFrame:CGRectMake(0, 250, 320, 100)];
newview=[self.view viewWithTag:1];
[self.view addSubview:newview];
// Do any additional setup after loading the view, typically from a nib.
}
-(void) button1pressed
{
UIStoryboard *storyboard=[UIStoryboard storyboardWithName:@"Main" bundle:nil];
button1ViewController *vc=[storyboard instantiateViewControllerWithIdentifier:@"button1ViewController"];
[self presentViewController:vc animated:NO completion:nil];
}
-(void) button2pressed
{
UIStoryboard *storyboard=[UIStoryboard storyboardWithName:@"Main" bundle:nil];
button2ViewController *vc=[storyboard instantiateViewControllerWithIdentifier:@"button2ViewController"];
[self presentViewController:vc animated:NO completion:nil];
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end
данный ниже вид класса контроллера для ViewController, когда первая кнопка прослушиваются.
// button1ViewController.h
#import <UIKit/UIKit.h>
#import "topview.h"
#import "ViewController.h"
#import "button2ViewController.h"
@class topview;
@interface button1ViewController : UIViewController
<buttonprotocol>
{
UIView *newview;
topview *topviewobj;
}
@end
// button1ViewController.m
#import "button1ViewController.h"
@interface button1ViewController()
@end
@implementation button1ViewController
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
// Custom initialization
}
return self;
}
- (void)viewDidLoad
{
[super viewDidLoad];
topviewobj=[topview new];
topviewobj.delegate=self;
NSLog(@"%@",topviewobj.delegate);
self.view.backgroundColor=[UIColor purpleColor];
UIStoryboard *storyboard=[UIStoryboard storyboardWithName:@"Main" bundle:nil];
ViewController *vc=[storyboard instantiateViewControllerWithIdentifier:@"ViewController"];
newview=[[UIView alloc]init];
newview=[vc.view viewWithTag:1];
UIButton *backbutton=[[UIButton alloc]init];
[backbutton setTitle:@"Back" forState:UIControlStateNormal];
[backbutton setTitleColor:[UIColor blueColor] forState:UIControlStateNormal];
[backbutton setFrame:CGRectMake(5, 30, 60, 30)];
[backbutton addTarget:self action:@selector(back) forControlEvents:UIControlEventTouchUpInside];
[newview addSubview:backbutton];
[self.view addSubview:newview];
// Do any additional setup after loading the view.
}
-(void) back
{
UIStoryboard *storyboard=[UIStoryboard storyboardWithName:@"Main" bundle:nil];
ViewController *vc=[storyboard instantiateViewControllerWithIdentifier:@"ViewController"];
[self presentViewController:vc animated:NO completion:nil];
}
-(void) button1pressed
{
UIStoryboard *storyboard=[UIStoryboard storyboardWithName:@"Main" bundle:nil];
button1ViewController *vc=[storyboard instantiateViewControllerWithIdentifier:@"button1ViewController"];
[self presentViewController:vc animated:NO completion:nil];
}
-(void) button2pressed
{
UIStoryboard *storyboard=[UIStoryboard storyboardWithName:@"Main" bundle:nil];
button2ViewController *vc=[storyboard instantiateViewControllerWithIdentifier:@"button2ViewController"];
[self presentViewController:vc animated:NO completion:nil];
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end
Ниже приведен класс для ViewController для ViewController, когда вторая кнопка прослушиваются.
// button2ViewController.h
#import <UIKit/UIKit.h>
#import "topview.h"
#import "ViewController.h"
@class topview;
@interface button2ViewController : UIViewController
<buttonprotocol>
{
UIView *newview;
topview *topviewobj;
}
@end
// button2ViewController.m
#import "button2ViewController.h"
@interface button2ViewController()
@end
@implementation button2ViewController
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
// Custom initialization
}
return self;
}
- (void)viewDidLoad
{
[super viewDidLoad];
topviewobj=[topview new];
topviewobj.delegate=self;
NSLog(@"%@",topviewobj.delegate);
self.view.backgroundColor=[UIColor purpleColor];
UIStoryboard *storyboard=[UIStoryboard storyboardWithName:@"Main" bundle:nil];
ViewController *vc=[storyboard instantiateViewControllerWithIdentifier:@"ViewController"];
newview=[[UIView alloc]init];
newview=[vc.view viewWithTag:1];
UIButton *backbutton=[[UIButton alloc]init];
[backbutton setTitle:@"Back" forState:UIControlStateNormal];
[backbutton setTitleColor:[UIColor blueColor] forState:UIControlStateNormal];
[backbutton setFrame:CGRectMake(5, 30, 60, 30)];
[backbutton addTarget:self action:@selector(back) forControlEvents:UIControlEventTouchUpInside];
[newview addSubview:backbutton];
[self.view addSubview:newview];
// Do any additional setup after loading the view.
}
-(void) back
{
UIStoryboard *storyboard=[UIStoryboard storyboardWithName:@"Main" bundle:nil];
ViewController *vc=[storyboard instantiateViewControllerWithIdentifier:@"ViewController"];
[self presentViewController:vc animated:NO completion:nil];
}
-(void) button1pressed
{
UIStoryboard *storyboard=[UIStoryboard storyboardWithName:@"Main" bundle:nil];
button1ViewController *vc=[storyboard instantiateViewControllerWithIdentifier:@"button1ViewController"];
[self presentViewController:vc animated:NO completion:nil];
}
-(void) button2pressed
{
// UIStoryboard *storyboard=[UIStoryboard storyboardWithName:@"Main" bundle:nil];
// button2ViewController *vc=[storyboard instantiateViewControllerWithIdentifier:@"button2ViewController"];
// [self presentViewController:vc animated:NO completion:nil];
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
@end
Это все, что я получил. Я не могу показать свой оригинальный код из-за проблем с конфиденциальностью. Это образец, созданный для демонстрации проблемы. Я не могу загружать изображения, так как у меня низкая репутация.
Это очень сложно помочь без кода. Если ошибка возникает при вызове делегата, я думаю, что у вас есть предупреждения в вашем проекте, и вы назначили делегат, но не реализовали этот метод. Вам также может понадобиться подумать о переходе на вкладку точки останова, нажать «плюс» внизу и «добавить точку останова исключения», которая в большинстве случаев покажет вам строку, вызывающую проблему. Удачи. –
@SkylerLauren: хорошо, что лучший способ использовать представление viewcontroller в другом диспетчере представлений без копирования. –
@SkylerLauren: Я добавил код. –