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