2016-11-24 5 views
1

Я создал два представления в своем проекте. Я хочу, чтобы у меня была возможность щелкнуть по кнопке на главном экране, и появится другое представление (ChooseCar), позволяющее пользователю выбрать что-то, а затем снова откроет старый вид (ViewController) с введенной информацией. Я сделал код для этого, но по какой-то причине, когда я нажимаю кнопку, экран просто черным, ничего не происходит, я уверен, что это что-то очень просто, я просто не могу обдумать его.iOS presentViewController Делегаты, возвращающие черный экран

Прилагаю код для показа ниже, спасибо.

ViewController.h

// 
// ViewController.h 
// 
// Created by Curtis Boylan on 24/11/2016. 
// Copyright © 2016. All rights reserved. 
// 

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

@interface ViewController : UIViewController <ChooseCarDelegate> 
- (IBAction)chooselocation; 
@property (strong, nonatomic) IBOutlet UILabel *wherelocation; 

@end 

ViewController.m

// 
// ViewController.m 
// 
// Created by Curtis Boylan on 24/11/2016. 
// Copyright © 2016. All rights reserved. 
// 

#import "ViewController.h" 

@interface ViewController() 
@end 

@implementation ViewController 

- (void)viewDidLoad { 
    [super viewDidLoad]; 
} 
- (void)didReceiveMemoryWarning { 
    [super didReceiveMemoryWarning]; 
    // Dispose of any resources that can be recreated. 
} 
-(UIStatusBarStyle)preferredStatusBarStyle{ 
    return UIStatusBarStyleLightContent; 
} 
- (IBAction)chooselocation { 
    ChooseCar *acController = [[ChooseCar alloc] init]; 
    // acController.delegate = self; 
    [self presentViewController:acController animated:YES completion:nil];} 

- (void)addItemViewController:(ChooseCar *)controller didFinishEnteringItem:(NSString *)item 
{ 
    NSLog(@"This was returned from ChooseCar %@",item); 
} 

@end 

ChooseCar.h

// 
// ChooseCar.h 
// 
// Created by Curtis Boylan on 24/11/2016. 
// Copyright © 2016. All rights reserved. 
// 

#import <UIKit/UIKit.h> 
@class ChooseCar; 

@protocol ChooseCarDelegate <NSObject> 
- (void)addItemViewController:(ChooseCar *)controller didFinishEnteringItem:(NSString *)item; 
@end 

@interface ChooseCar : UIViewController 

@end 

ChooseCar.m

// 
// ChooseCar.m 
// 
// Created by Curtis Boylan on 24/11/2016. 
// Copyright © 2016. All rights reserved. 
// 

#import "ChooseCar.h" 

@interface ChooseCar() 
@property (nonatomic, weak) id <ChooseCarDelegate> delegate; 
@end 

@implementation ChooseCar 

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view. 

    NSString *itemToPassBack = @"Pass this value back to ViewControllerA"; 
    [self.delegate addItemViewController:self didFinishEnteringItem:itemToPassBack]; 

} 

- (void)didReceiveMemoryWarning { 
    [super didReceiveMemoryWarning]; 
    // Dispose of any resources that can be recreated. 
} 

/* 
#pragma mark - Navigation 

// In a storyboard-based application, you will often want to do a little preparation before navigation 
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { 
    // Get the new view controller using [segue destinationViewController]. 
    // Pass the selected object to the new view controller. 
} 
*/ 

@end 
+0

Я не вижу, где вы закроете представленный VC. Разве вы не должны это делать в методе делегата? – danh

+0

Просто попробовал это, все еще давая мне черный экран –

+0

Вы использовали раскадровку или xib для создания 'SelectCar' ViewController? – Mahesh

ответ

2

Его легко сделать:

1) Я считаю, что ваш ChooseCar ВХ создан в storyboard. если да, то вы должны установить Storyboard ID так:

set storyboard id

2) В вашем ViewController.m, обновите ваш метод chooselocation к этому:

- (IBAction)chooselocation { 
//ChooseCar *acController = [[ChooseCar alloc] init]; 

UIStoryboard *sb = [UIStoryboard storyboardWithName:@"Main" bundle:nil]; 


ChooseCar *acController = [sb instantiateViewControllerWithIdentifier:@"ChooseCar"]; 

[self presentViewController:acController animated:YES completion:nil]; 

} 

EDIT

Если вы хотите передать делегату значение:

у основания моего дать.

1) сократить этот код @property (nonatomic, weak) id <ChooseCarDelegate> delegate; от вашего ChooseCar.m к ChooseCar.h, убедитесь, что ChooseCar.h так:

#import <UIKit/UIKit.h> 

@class ChooseCar; 

@protocol ChooseCarDelegate <NSObject> 


- (void)addItemViewController:(ChooseCar *)controller didFinishEnteringItem:(NSString *)item; 

@end 


@interface ChooseCar : UIViewController 

@property (nonatomic, weak) id <ChooseCarDelegate> delegate; 

@end 

2) В ViewController.m, вы должны соблюдать в protocal и установить caController «s делегата.

#import "ChooseCar.h" 
#import "ViewController.h" 

@interface ViewController() <ChooseCarDelegate> 

@end 

@implementation ViewController 

- (void)viewDidLoad { 
    [super viewDidLoad]; 
} 
- (void)didReceiveMemoryWarning { 
    [super didReceiveMemoryWarning]; 
    // Dispose of any resources that can be recreated. 
} 
-(UIStatusBarStyle)preferredStatusBarStyle{ 
    return UIStatusBarStyleLightContent; 
} 
- (IBAction)chooselocation { 
    //ChooseCar *acController = [[ChooseCar alloc] init]; 

    UIStoryboard *sb = [UIStoryboard storyboardWithName:@"Main" bundle:nil]; 


    ChooseCar *acController = [sb instantiateViewControllerWithIdentifier:@"ChooseCar"]; 

    acController.delegate = self; 

    [self presentViewController:acController animated:YES completion:nil]; 

} 

- (void)addItemViewController:(ChooseCar *)controller didFinishEnteringItem:(NSString *)item 
{ 
    NSLog(@"This was returned from ChooseCar %@",item); 
} 

@end 

3) Если вы хотите, чтобы передать значение, вы должны принять этот код на ваши действия:

NSString *itemToPassBack = @"Pass this value back to ViewControllerA"; 
[self.delegate addItemViewController:self didFinishEnteringItem:itemToPassBack]; 
+0

Это работает и открывает вид choosecar, но не возвращает меня в контроллер вида и передает значение –

+0

@Curtis Boylan У меня есть EDIT мой ответ, вы выглядите так. – aircraft

+0

Работает отлично, спасибо! –

1

Замените код следующим образом:

ViewController.ч

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

@interface ViewController : UIViewController <ChooseCarDelegate> 
- (IBAction)chooselocation; 
@property (strong, nonatomic) IBOutlet UILabel *wherelocation; 

@end 

ViewController.m

#import "ViewController.h" 

@interface ViewController() 
{ 
    ChooseCar *acController; 
} 
@end 

@implementation ViewController 

- (void)viewDidLoad { 
    [super viewDidLoad]; 
} 
- (void)didReceiveMemoryWarning { 
    [super didReceiveMemoryWarning]; 
    // Dispose of any resources that can be recreated. 
} 
-(UIStatusBarStyle)preferredStatusBarStyle{ 
    return UIStatusBarStyleLightContent; 
} 
- (IBAction)chooselocation { 

    acController = [self.storyboard instantiateViewControllerWithIdentifier:@"ChooseCar"]; 
    acController.delegate = self; 
    [self presentViewController:acController animated:YES completion:nil]; 

} 

- (void)addItemViewController:(ChooseCar *)controller didFinishEnteringItem:(NSString *)item 
{ 
    [acController dismissViewControllerAnimated:true completion:nil]; 
    NSLog(@"This was returned from ChooseCar %@",item); 
} 

@end 

Также установите раскадровки идентификатор в раскадровке. Для получения дополнительной информации см приложенный скриншот:

enter image description here

ChooseCar.h

#import <UIKit/UIKit.h> 
@class ChooseCar; 

@protocol ChooseCarDelegate <NSObject> 
- (void)addItemViewController:(ChooseCar *)controller didFinishEnteringItem:(NSString *)item; 
@end 

@interface ChooseCar : UIViewController 
@property (nonatomic, weak) id <ChooseCarDelegate> delegate; 
@end 

ChooseCar.m

#import "ChooseCar.h" 

@interface ChooseCar() 
@end 

@implementation ChooseCar 

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view. 

// NSString *itemToPassBack = @"Pass this value back to ViewControllerA"; 
// [self.delegate addItemViewController:self didFinishEnteringItem:itemToPassBack]; 

} 

- (void)didReceiveMemoryWarning { 
    [super didReceiveMemoryWarning]; 
    // Dispose of any resources that can be recreated. 
} 
- (IBAction)backButtonClicked:(id)sender { 
    NSString *itemToPassBack = @"Pass this value back to ViewControllerA"; 
    [self.delegate addItemViewController:self didFinishEnteringItem:itemToPassBack]; 
} 

/* 
#pragma mark - Navigation 

// In a storyboard-based application, you will often want to do a little preparation before navigation 
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { 
// Get the new view controller using [segue destinationViewController]. 
// Pass the selected object to the new view controller. 
} 
*/ 

@end 
+0

Да, это отлично работает, но открывает вид ChooseCar и не возвращается к ViewController. Он также не возвращает элемент из SelectCar. Любое решение, чтобы сделать эту работу? –

+0

Когда вы хотите вернуться? Нажатие кнопки? – User511

+0

Да, нажав кнопку, я хочу, чтобы она вернула вас обратно в другое представление и передала значение элемента. –

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