1

Xコード4.3.2を使用しています。そして、新しいページベースのアプリケーション プロジェクトを作成します。次に、そのボタンをクリックしたときに特定のページにジャンプするために、dataViewController クラスに UIButton を作成します。

ここに私が追加した簡単なコードがあります。

 //Create a button in dataViewController.h
 @property (strong, nonatomic) IBOutlet UIButton *btn;

//Add button action
-(IBAction)jump:(id)sender{
    RootViewController *root = [[RootViewController alloc]init];
    [root jump2page];
}

RootViewController クラス内

-(void)jump2page
{
    DataViewController *targetViewController = [self.modelController viewControllerAtIndex:2 storyboard:self.storyboard];

    NSArray *viewControllers = [NSArray arrayWithObjects:targetViewController,nil];
    [self.pageViewController setViewControllers:viewControllers direction:UIPageViewControllerNavigationDirectionForward animated:YES completion:NULL];
}

ボタンをクリックすると、メソッド jump2page が呼び出されます。3 月のページに移動する必要がありますが、クリックしても何も起こりません。

私は何かを忘れたり見逃したりしますか?

4

1 に答える 1

0

また、ページジャンプを行う方法を理解するのにも問題がありました。チャットで提案されたすべてのことでさえ、私がしていたことはすべて行き止まりでした。あなたのメソッドを使用して、関数への呼び出しが発生し、モーダルビューコントローラーからもデータを取得したことを確認できました。nullオブジェクトエラーが発生しました。ビューを設定するとき。そのため、何が起こっているのかをほぼまとめたので、何が起こっているのかを確認するために、さらにいくつかの診断メッセージを入れました。私が入れていたすべてのデータは問題なく流れていました。問題は、ストーリーボード オブジェクトが何らかの理由で null であり、ストーリーボードに何もないことがわかる限り、どれをロードするかを知っていても、ストーリーボードからのアイテムのロードに失敗したことでした。空のオブジェクトを返しました。その後、メインのクラッシュに戻りました。そのため、ストーリーボード オブジェクトが null である理由を突き止めようとしました。なぜ早く解放されたのですか?は私の最初の質問でした。コピーを作成して、そこからコピーを使用できるようにしようと思いました。まだサイコロはありません。次に、alloc と init を使用しているトップ ビュー コントローラーで (神に感謝します) 思いつきました。これが、新しいオブジェクトの作成方法です。実際のルート コントローラーへのリンクを作成する代わりに、コマンドが 2 番目のルート コントローラー ウィッチを作成し、プログラムがそれらのクラス タイプに対して持っているのと同じクラス テンプレートからバイアスをかけられた 2 番目のモーダル コントローラーを作成し、関数呼び出しを渡している可能性があります。それに。その場合、新しいルート ビュー コントローラーには最初のストーリーボードのストーリーボードがありません。また、それらは事実上別々のオブジェクトであるため、影響を与えることもできません。その仮定を続けると、あなたの方法を使用できなかったので、最初からやり直すことに気づきました。しかし、別の神がひらめきを与えたとき、実際のルート ビュー コントローラーへのポインターをチェーンのトップ ビュー コントローラーに送信し、そのポインターをコールバックに使用した場合はどうなるでしょうか。それで私はそれを試してみました、そして見よ、ついに私はそれを働かせました。

だから私がやったのは、このようなタイプidのトップビューコントローラー.hに新しいプロパティを設定することでした

@property (weak,nonatomic) id homebase;

次に、これをトップビューコントローラーの.mファイルに入れます

@synthesize homebase;

次に、ルートView Controllerに戻り、 viewdidloadと回転オブザーバーのハンドラーを変更して、 DataViewControllerを作成した直後にこの行に追加しました

startingViewController.homebase=self;

これにより、トップ ビュー コントローラーで定義したプロパティが実際のルート ビュー コントローラーのアドレスに設定されます。最後にしたことは、ボタンクリックイベントを変更することでした

- (IBAction)pushedbutton:(UIButton *)sender 
{
   if (homebase==nil)
   {
      NSLog(@"no homebase");
      return;
   }
   [homebase jumpto:1];
}

これを最初のページで使用すると(値を1以外のページに設定すると)、そのページにジャンプすることがわかりました。これを他のページで使用すると、デバイスを回転させない限り「no homebse」と吐き出され、動作します。

didFinishAnimatingを変更して、ボタンがクリックされるまでは必要ないため、ロードが完了した後にそこに参照を平手打ちできるかどうかを確認しました。これは、この関数が実行されるまで発生しませんが、そこからそのプロパティにアクセスできませんでした見ることができます。

さらにいくつかの作業を行った後、ここでの最後のステップは、viewControllerAtIndexを変更してポインターを取得して保存し、それを DataView コントローラーに設定してから戻すことであることがわかりました。次に、null ポインターで呼び出されると、代わりに格納されたものを使用します。そうすれば、両方のタイプの呼び出しで、ハンドオフするポインターがあり、すべてがうまくいきます。ページをめくって最初に回転させなくても。

于 2012-08-11T20:04:55.757 に答える