我在项目中创建了两个视图。我希望能够单击主视图上的按钮,另一个视图(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:

ios - iOS presentViewController代表返回黑屏-LMLPHP

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

10-05 17:48