initWithNibName 帮助:尝试传递数据时返回空白屏幕
Posted
技术标签:
【中文标题】initWithNibName 帮助:尝试传递数据时返回空白屏幕【英文标题】:initWithNibName help: returning blank screen when trying to pass data 【发布时间】:2012-12-06 21:20:34 【问题描述】:好的,我正在尝试通过 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 的新手,所以我可能会犯一个非常基本的错误。如果有任何其他信息有助于回答这个问题,请告诉我。
【问题讨论】:
你有与你正在实例化的视图控制器相关联的笔尖吗? 为什么您的 selectedMenuItem 不是您的视图控制器之一的属性? 很抱歉,我不知道如何创建 nib 文件。你能帮我解决这个问题吗? 你不需要创建一个在这种情况下分配你的视图控制器 [[MyMealViewController alloc] init] 问题是如果我这样做了,那么一旦字符串被传递,模拟器中的屏幕就会变成黑色。我想我需要一种方法来重新加载当前屏幕。 【参考方案1】:编辑:您似乎想在第一个视图中显示食品列表。点击一个项目会打开一个详细视图。从该详细视图中,用户可以按下按钮将其添加到餐点中。最后,他们可以在第一个视图上点击一个按钮来打开餐点视图,其中应该包含他们选择的所有项目。
如果是这种情况,请在第一个视图控制器上保留一个数组,并确保细节(第二个)视图控制器在呈现时具有对第一个视图控制器的引用。这将让我们使用该数组。请注意,有更好的方法来构建它,但现在可以使用:
@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
显示详细视图后,点击“添加到餐点”按钮应将当前的“餐点项目”添加到数组中。在您的示例中,您使用的是字符串 - 如果您出于某种原因希望保留一个字符串数组,我将把它留给您。
@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
如您所见,第二个和第三个视图控制器都由第一个呈现。视图控制器(几乎)总是形成一个层次结构 - 因此将数据保持在该层次结构的顶部(通过将其存储在 FoodListViewController 中)可以让您在呈现其他视图控制器时巧妙地将其传递到层次结构中。
【讨论】:
如果这非常明显,我深表歉意,但我会删除上面代码的哪一部分,以免创建 MyMealViewController?似乎如果我删除任何代码行,则该字符串将不再通过。 只留下两行获取应用委托(数据中心)的引用,然后设置 selectedMenuItem。该字符串现在将存储在应用程序委托中。 MyMealViewController 什么时候显示? 所以我接受你的建议意味着离开:“AppDelegate *dataCenter = (AppDelegate *)[[UIApplication sharedApplication] delegate];”和“dataCenter.selectedMenuItem = recipeLabel.text;”这也是我想做的,但是当我删除任何其他行时,字符串不再传递给另一个视图控制器。 让我解释一下我的应用程序的基本结构/功能,也许这会有所帮助:在第一个视图中向用户展示了一个项目表。他们可以选择一个项目以获得第二个详细视图。在第二个详细视图中,他们可以按下按钮将该项目的名称发送到第三个视图(MyMealViewController 视图)中的表中。然后,当他们完成选择要发送到第三个视图中的表的项目时,他们可以通过第一个视图上的按钮导航到第三个视图。届时将显示 MyMealViewController。以上是关于initWithNibName 帮助:尝试传递数据时返回空白屏幕的主要内容,如果未能解决你的问题,请参考以下文章
iPhone:TableViewController nibName 错误,带有“initWithNibName:bundle:”