iOS presentViewController 委托返回黑屏

iOS presentViewController Delegates Returning Black Screen

我在我的项目中创建了两个视图。我希望能够单击我的主视图上的一个按钮,另一个视图 (ChooseCar) 将弹出,允许用户选择一些东西,然后它会重新打开旧视图 (ViewController) 并输入信息。我已经为它编写了代码,但是由于某种原因,当我单击按钮时,屏幕变黑了,什么也没有发生,我很确定这是非常简单的事情,我只是无法理解它。

我会在下面附上视图的代码,谢谢。

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

很容易做到:

1)我相信您的 ChooseCar vc 是在 storyboard 中创建的。 如果是,您应该像这样设置 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];

}

编辑

如果你想通过委托传递一个值:

在我给予的基础上。

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的委托。

#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];

用以下代码替换您的代码:

ViewController.h

#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

同时在情节提要中设置情节提要ID。有关详细信息,请参阅随附的屏幕截图:

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