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");
}

「ここ」に入ると、画面が真っ暗になります。これは、日付ピッカーコントローラーのインスタンス化またはそれにセグエを使用して何かを正しく行っていないためだと思います。問題のすべてのビューは、ストーリーボード構成のそれぞれのコントローラーに関連付けられています。問題をさらに混乱させるために、私は別の画面用に作成したUITableViewControllerを持っており、たわごとや笑いのためだけにそれをロードしようとしましたが、正常に機能しました。次に、別の完全に別個のUIViewControllerを作成し、現在機能していないUIViewControllerを制御するコントローラーファイルをポイントしました。これも爆弾であるため、問題は、機能していないUIViewControllerのヘッダーファイルとメインファイルにあると考えています。ed。その最後のメモをスクラッチします。ビュー用に完全に新しいヘッダー、メインファイル、および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をNavigationコントローラースタックにプッシュしています。削除するには、ポップする必要があります。

present / dismissを試すこともできますが、NavControllerスタックで機能するかどうかはわかりません。

更新:DatePickerViewController.hファイルでviewDidLoadを再宣言している理由がわかりません。それを取り出してください。

また、すべてのビューのDid / Will Load / Appearメソッドでは、superを呼び出すことから始める必要があります。したがって、DatePickerViewController.mのviewDidLoadメソッドの最初の行として[superviewDidLoad]を挿入します

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

私の間違いは、ビューを(構成ペインのClassプロパティの下にある)viewcontrollerファイルに単純に関連付けると、必要なのはそれだけだと思ったことです。ただし、ストーリーボードを使用している場合、UIプロセスは、自動またはプログラムで、ビューがインスタンス化されることを期待しています(おそらく、複数のビューが同じビューコントローラーを使用できるためです)。

于 2013-03-04T01:38:25.133 に答える