从动作表中手动呈现模态视图

时间:2013-03-02 23:10:42

标签: ios ios6 uiviewcontroller uistoryboardsegue

我是iOS开发人员的新手,我一直在阅读这个问题,但仍然无法理解。

我在操作表中有一个按钮,该按钮应该激活并显示一个向上/向日的拣选屏幕的滑动模式(它有自己的控制器DatePickerViewController。操作表由以下内容触发: NavigationViewController子视图工具栏中的按钮(“显示地图”视图,左上角按钮)。图形显示当前故事板关系:

Navigation controller to modal relationships

此序列的代码如下所示:

// 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

2 个答案:

答案 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过程期望通过它实现视图,无论是自动还是以编程方式(大概是因为多个视图可以使用相同的视图控制器)。