我是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
答案 0 :(得分: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推送到导航控制器堆栈。您需要弹出它才能将其删除。
你也可以尝试使用present / dismiss,但我不确定它是否适用于Nav Controller堆栈。
更新: 我不确定你为什么要在DatePickerViewController.h文件中重新声明viewDidLoad。拿出来。
同样在所有视图中有/将加载/出现方法,您需要从调用超级开始。因此,将[super viewDidLoad]作为第一行插入DatePickerViewController.m的viewDidLoad方法
答案 1 :(得分: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]];
接下来,使用该storyboard对象实例化要显示的视图:
// 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过程期望通过它实现视图,无论是自动还是以编程方式(大概是因为多个视图可以使用相同的视图控制器)。