2015-03-01 4 views
2

У меня есть 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 

Это все, что я получил. Я не могу показать свой оригинальный код из-за проблем с конфиденциальностью. Это образец, созданный для демонстрации проблемы. Я не могу загружать изображения, так как у меня низкая репутация.

+0

Это очень сложно помочь без кода. Если ошибка возникает при вызове делегата, я думаю, что у вас есть предупреждения в вашем проекте, и вы назначили делегат, но не реализовали этот метод. Вам также может понадобиться подумать о переходе на вкладку точки останова, нажать «плюс» внизу и «добавить точку останова исключения», которая в большинстве случаев покажет вам строку, вызывающую проблему. Удачи. –

+2

@SkylerLauren: хорошо, что лучший способ использовать представление viewcontroller в другом диспетчере представлений без копирования. –

+1

@SkylerLauren: Я добавил код. –

ответ

1

Это выглядит весьма подозреваемый ...

UIView *newview=[[UIView alloc]initWithFrame:CGRectMake(0, 250, 320, 100)]; 
newview=[self.view viewWithTag:1]; 
[self.view addSubview:newview]; 

Вы не должны Alloc инициализации нового взгляда, если следующая строка вы собираетесь использовать viewWithTag, потому что вид будет уже inited. Также в следующей строке вы вызываете addSubView на то же самое, что вы получили только представление, которое будет работать, только если представление уже добавлено.

Редактировать

После дальнейшей проверки вашего кода я вижу, что вы пытаетесь сделать. Есть несколько вещей, чтобы отметить. Если вы хотите передать объект новому контроллеру представления, вы можете сделать это при создании нового контроллера представления.

UIStoryboard *storyboard=[UIStoryboard storyboardWithName:@"Main" bundle:nil]; 
button1ViewController *vc=[storyboard instantiateViewControllerWithIdentifier:@"button1ViewController"]; 

//if button1ViewController had a property for topviewobj instead of an instance variable. 
button1ViewController.topviewobj = (topview *)[self.view viewWithTag:1]; 
[self presentViewController:vc animated:NO completion:nil]; 

//in button1ViewController viewDidLoad 
self.topviewobj.delegate = self; 
[self.view addSubView:self.topviewobj]; 

С этим сказанным я думаю, что вы действительно хотите сделать, это посмотреть в наконечники или создать Topview только в коде.

Если только в коде это будет что-то вроде

_topviewobj = [[topview alloc]initWithFrame:CGRectMake(0,250, 320, 100)]; 
_topviewobj.delegate = self; 
[self.view addSubview:_topviewobj]; 

Кроме этого, скорее всего, вызовет проблемы в будущем ...

-(void) back 
{ 
    UIStoryboard *storyboard=[UIStoryboard storyboardWithName:@"Main" bundle:nil]; 
    ViewController *vc=[storyboard instantiateViewControllerWithIdentifier:@"ViewController"]; 
    [self presentViewController:vc animated:NO completion:nil]; 
} 

Создание новых UIViewControllers снова и снова, не является идеальным , Попробуйте это ...

-(void) back 
{ 
    [self dismissViewControllerAnimated:YES completion:nil]; 
} 

Как я уже говорил прежде, чем я хотел бы посмотреть на наконечниками или просто создание UIView Подкласс и Alloc/инициализации, установите делегат, и добавить подвид, когда он вам нужен.

Я надеюсь, что все это имеет смысл и помогает.

+2

не могу сделать button1ViewController.topviewobj = [self.view viewWithTag: 1]; topviewobj не является uiview –

+2

vc.topviewobj = [self.view viewWithTag: 1]; несовместимые типы указателей, присваивающие 'topview *' из 'UIView *' –

+0

Вам нужно было бы бросить его ... Я обновил ответ для вас. –

Смежные вопросы