【问题标题】:Presenting a modal view manually from an actionsheet从操作表手动呈现模态视图
【发布时间】:2013-03-02 23:10:41
【问题描述】:

我是 iOS 开发的新手,我已经阅读了大量关于这个问题的文章,但仍然无法弄清楚。

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

此序列的代码如下所示:

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

}

根据 cmets。

附录 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

【问题讨论】:

  • 操作表上的按钮不应该直接连接到 datePickerViewController 的任何原因?为什么需要 datePickerViewController 连接到 Nav 控制器?
  • 操作表是动态创建的,所以我不确定如何实现。我将更新我的操作表实例化代码。
  • 请在下面查看我更新的答案。

标签: ios ios6 uiviewcontroller uistoryboardsegue


【解决方案1】:

我会断开 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 推送到 Navigation 控制器堆栈。您需要将其弹出以将其删除。

您也可以尝试使用 present/dismiss,但我不确定它是否适用于 Nav Controller 堆栈。

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

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

【讨论】:

  • 这仍然给我同样的黑屏。
  • 发现错误并更新。使用 self.navigationController 而不是 self 来推送。
  • 嗯,同样的交易。我一定错过了一些更基本的东西。我将在我原来的问题中添加更多内容。
  • 根据您的更新:我实际上完全删除了这两个文件。我已经用新的文件内容更新了主要问题。我仍然收到黑屏。日志中没有错误。
【解决方案2】:

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

// "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 进程期望通过它实例化视图,无论是自动还是编程(可能是因为多个视图可以使用同一个视图控制器)。

【讨论】:

  • 你不需要实例化 Storyboard 对象,你可以使用UIViewController *dateRangeController = [self.storyboard instantiateViewControllerWithIdentifier:@"dateRange"];
  • 我后来学到的东西 :) 感谢您添加信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多