1

我对 iOS 开发人员很陌生,我已经阅读了大量关于这个问题的内容,但仍然无法弄清楚。

我在操作表中有一个按钮,它应该激活并呈现一个上滑模式,它是一个从/到日期选择屏幕(它有自己的控制器DatePickerViewController。操作表由 NavigationViewController 的工具栏中的按钮触发子视图(“放映地图”视图,左上角按钮)。图形显示了当前的故事板关系:

导航控制器到模态关系

此序列的代码如下所示:

// ShowsContainerController.m
- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex
{
    if( buttonIndex == 1 ){
        // 1. Activates from actionsheet
        [(NavigationViewController *)self.parentViewController showDateSelect];
    }
}

// NavigationViewController.m
// 2. fires up the datepicker view
-(void)showDateSelect
{
    pickerView = [[DatePickerViewController alloc] init ];

    [self presentViewController:pickerView animated:YES completion:nil];
}

// DatePickerViewController.m
// 3. Instantiation of this controller. Definitely fires nslog.
-(void)viewDidLoad
{
    NSLog(@"Here");
}

一旦“这里”,屏幕就会变黑。我认为这是因为我没有在日期选择器控制器的实例化或对它的 segue 上做正确的事情。所有有问题的视图都与故事板配置中它们各自的控制器相关联。为了进一步混淆这个问题,我有一个为另一个屏幕创建的 UITableViewController,只是为了大便和咯咯笑,尝试加载它,它工作正常。然后我创建了另一个完全独立的 UIViewController,将它指向控制当前非工作的控制器文件,它也爆炸了,所以我认为问题是非工作 UIViewController 的头文件和主文件。编。划掉最后一个音符;我为视图创建了一个全新的标题、主文件和 NIB,但它仍然无法正常工作。我不知道这到底是什么交易。

任何和所有的帮助将不胜感激。

附录

- (IBAction)showOptions:(id)sender
{
    NSString *showTypes;

    if( self.onlyShowPreferredEvents ){
        showTypes = @"\u2713 Only shows that I'll like";
    } else {
        showTypes = @"Only shows that I'll like";
    }

    _showDisplayOptionsActionSheet = [[UIActionSheet alloc] initWithTitle:@"Event Display Settings" delegate:self cancelButtonTitle:@"Cancel" destructiveButtonTitle:nil otherButtonTitles: showTypes, @"Date Range", nil];

    [_showDisplayOptionsActionSheet showFromTabBar:self.tabBarController.tabBar];

}

根据评论。

附录 2 // 所有 DatePickerViewController.m

#import "DateRangeViewController.h"

@interface DateRangeViewController ()

@end

@implementation DateRangeViewController

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
    }
    return self;
}

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

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

@end


// All of DatePickerViewController.h

#import <UIKit/UIKit.h>

@interface DateRangeViewController : UIViewController

@end
4

2 回答 2

0

我会断开 DatePickerViewController 与 Nav 控制器的连接,并将其保留为独立的 VC。

然后摆脱 showDateSelect 并将 clickedButtonAtIndex 方法更改为以下内容:

- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex
{
  if( buttonIndex == 1 )
  {
    pickerView = [[DatePickerViewController alloc] init ];
    [self.navigationController pushViewController:pickerView animated:YES];
  }
}

在这里,您将 pickerView 推送到导航控制器堆栈。您需要将其弹出以将其删除。

您也可以尝试当前/关闭,但我不确定它是否适用于导航控制器堆栈。

更新:我不确定您为什么要在 DatePickerViewController.h 文件中重新声明 viewDidLoad。把它拿出来。

同样在所有视图 Did/Will Load/Appear 方法中,您需要从调用 super 开始。因此,在 DatePickerViewController.m 的 viewDidLoad 方法中插入 [super viewDidLoad] 作为第一行

于 2013-03-03T00:34:47.243 回答
0

弄清楚了。问题是,当您像我一样使用情节提要时,并且以编程方式呈现视图时,您需要从创建情节提要对象开始:

// "MainStoryboard_iPhone" is your .storyboard file's name
// [NSBundle mainBundle] returns the main storyboard bundle.
UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"MainStoryboard_iPhone"
                                                         bundle:[NSBundle mainBundle]];

接下来,您使用该故事板对象实例化您想要呈现的视图:

// Give your view an identifier in the storyboard. That's how the storyboard object will find it. 
// You should see it in the right panel options when you click on the view.
UIViewController *dateRangeController = [storyboard instantiateViewControllerWithIdentifier:@"dateRange"];

当下。

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

我的错误是认为如果您只是将视图与 viewcontroller 文件相关联(在配置窗格中的 Class 属性下),这就是所需要的。但是,如果您使用情节提要,UI 进程期望通过它实例化视图,无论是自动还是以编程方式(可能是因为多个视图可以使用同一个视图控制器)。

于 2013-03-04T01:38:25.133 回答