0

わかりましたので、AppDelegate を介して、あるビュー コントローラーから別のビュー コントローラーに文字列を渡そうとしています。これが起こっている間、私は現在のビューにとどまりたいです。

これは、これを行うために現在使用しているコードの本体です。

AppDelegate *dataCenter = (AppDelegate *)[[UIApplication sharedApplication] delegate];
MyMealViewController *vc = [[MyMealViewController alloc] initWithNibName:nil bundle:nil];

dataCenter.selectedMenuItem = recipeLabel.text;

[self presentViewController:vc animated:YES completion:NULL];

プログラムを実行すると、文字列が正しく渡されていることを確認できます。ただし、シミュレーターのビューは黒くなります。これは、initWithNibName が nil に設定されているためだと思います。

私の質問は次のとおりです。文字列が引き続き渡されるようにコードを変更するにはどうすればよいですか。ただし、現在のビューは引き続き iPhone に表示されます。現在のビューをリロードするだけのコード行はありますか?

この問題についてご協力いただきありがとうございます。私は xcode を初めて使用するので、非常に基本的なエラーを起こしている可能性があります。この質問に答えるのに役立つ追加情報があれば教えてください。

4

1 に答える 1

1

編集:最初のビューに食品のリストを表示したいようです。アイテムをタップすると、詳細ビ​​ューが開きます。その詳細ビューから、ユーザーはボタンを押して食事に追加できます。最終的に、最初のビューのボタンをタップして食事ビューを開くことができます。食事ビューには、選択したすべてのアイテムが含まれているはずです。

この場合は、最初のビュー コントローラーに配列を保持し、詳細 (2 番目の) ビュー コントローラーが表示されたときに最初のビュー コントローラーへの参照があることを確認します。これにより、その配列を使用できるようになります。これを設計するためのより良い方法があることに注意してください。ただし、これは今のところ機能します。

@interface FoodListViewController : UIViewController
@property (strong, nonatomic) NSMutableArray *foodItems
@end

@implementation FoodListViewController
- (void)showFoodItem
{
    FoodItemDetailViewController *detailViewController = [[FoodItemDetailViewController alloc] initWithNibName:nil bundle:nil];
    detailViewController.foodListController = self;
    [self presentModalViewController:detailViewController animated:YES];
}
@end

詳細ビューが表示されたら、「食事に追加」ボタンをタップすると、現在の「mealItem」が配列に追加されます。あなたの例では、文字列を使用していました。何らかの理由で文字列の配列を保持したい場合は、お任せします。

@interface FoodItemDetailViewController : UIViewController
@property (nonatomic, weak) FoodItemsViewController *foodListController;
@end

@implementation FoodItemDetailViewController

- (IBAction)buttonTapped:(id)sender
{
    [self.foodListController.foodItems addObject:self.mealItem];
    // Update the UI to let the user know that the item was added to the meal
}

@end

最後に、MealDetailsViewController を提示するときが来たら、構築してきた配列を渡します。

@interface MealDetailsViewController : UIViewController
@property (nonatomic, strong) NSArray *foodItems;
@end

@implementation MealDetailsViewController
    // Set foodItems before this view controller is presented, then use it to drive the
    // UITableView data source, or find some other way of displaying it.
@end

ご覧のとおり、2 番目と 3 番目のビュー コントローラーの両方が最初のビュー コントローラーによって表示されます。ビュー コントローラーは (ほぼ) 常に階層を形成します。そのため、データをその階層の最上位に保持する (FoodListViewController に格納することにより) と、他のビュー コントローラーを表示するときに、データを階層の下にきちんと渡すことができます。

于 2012-12-06T21:33:45.823 に答える