在具有内容视图和视图控制器的 tabbarcontroller 之间传递数据

Posted

技术标签:

【中文标题】在具有内容视图和视图控制器的 tabbarcontroller 之间传递数据【英文标题】:Passing data between tabbarcontroller which have content view and view controllers 【发布时间】:2014-10-21 02:48:47 【问题描述】:

我使用的是 xib 而不是故事板。

AppDelegate.m
ViewController1 *ViewController1 = [[ViewController1 alloc] init];
ViewController1.title = NSLocalizedString(@"1", @"1");
ViewController2 *ViewController2 = [[ViewController2 alloc] init];
ViewController2.title = NSLocalizedString(@"2", @"2");

BannerViewController *_bannerViewController1;
_bannerViewController1 = [[BannerViewController alloc] initWithContentViewController:ViewController1];

BannerViewController *_bannerViewController2;
_bannerViewController2 = [[BannerViewController alloc] initWithContentViewController:ViewController2];

_tabBarController = [[UITabBarController alloc] init];
_tabBarController.viewControllers = @[_bannerViewController1,_bannerViewController2];

self.window.rootViewController = _tabBarController;
[self.window makeKeyAndVisible];


ViewController1.m
#import "ViewController1.h"
#import "ViewController2.h"

ViewController2 *cvc = [[ViewController2 alloc] initWithNibName:nil bundle:nil];
cvc.strReceiveValue= "Testing";

ViewController2.h
@property (strong, retain) NSString *strReceiveValue;
ViewController2.m
- (void)viewDidLoad 
[super viewDidLoad];
NSLog(@"strMortgageAmount: %@", strMortgageAmount);

知道为什么我未能获得价值吗?我在想这可能与 initWithContentViewController 有关。

【问题讨论】:

【参考方案1】:

**

见下方更新

**

如果我正确理解了这个问题,您正在创建一个标签栏控制器(在 AppDelegate 中?)并希望将信息传递给与标签栏控制器关联的视图控制器?

如果是这样,看看这个:

UITabBarController *tabBarController = (UITabBarController *)self.window.rootViewController;
[tabBarController setDelegate:self];
UINavigationController *dashTVCnav = [[tabBarController viewControllers] objectAtIndex:0];

然后:

DashTVC *dashTVC = [[dashTVCnav viewControllers] objectAtIndex:0];
dashTVC.managedObjectContext = self.managedObjectContext;
dashTVC.uuid=uuid;

然后在 DashTVC.h 中:

@property (strong, nonatomic) NSManagedObjectContext *managedObjectContext;
@property (strong, nonatomic) NSString *uuid;

这样,您将 managedObjectContect 和 uuid 传递给 dashTVC 控制器。

我希望我明白你在问什么......

+++++++++++++++ 更新 +++++++++++++++++++++

原始发帖人很友好地给了我他的示例代码。我将在此处发布其中的部分内容以及我的修复,以供将来通过搜索找到此内容的人使用

有几个问题,但简而言之,没有任何东西传递给 vc2:

第一,appDelegate 没有传递任何内容

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

CGRect bounds = [[UIScreen mainScreen] bounds];
self.window = [[UIWindow alloc] initWithFrame:bounds];
self.window.backgroundColor = [UIColor whiteColor];

ViewController1 *vc1 = [[ViewController1 alloc] init];
vc1.title = NSLocalizedString(@"VC1", @"VC1");

ViewController2 *vc2 = [[ViewController2 alloc] init];
vc2.title = NSLocalizedString(@"VC2", @"VC2");

//---  I added this as a test
vc2.strReceiveValue=@"foo";

// and now foo shows up in the debug console when vc2 is fixed




_tabBarController = [[UITabBarController alloc] init];
_tabBarController.viewControllers = @[
    [[BannerViewController alloc] initWithContentViewController:vc1],
    [[BannerViewController alloc] initWithContentViewController:vc2],
];

self.window.rootViewController = _tabBarController;
[self.window makeKeyAndVisible];
return YES;

接下来需要修改viewController2.m中的viewWillAppear

- (void)viewWillAppear:(BOOL)animated 

// line below missing
[super viewWillAppear:animated];
NSLog(@"output: %@", strReceiveValue);

希望这会有所帮助,并享受为 ios 开发的乐趣!

【讨论】:

这也是一个很好的审查答案***.com/questions/5210535/… 我已经更新了问题,我认为现在应该清除它以解释问题......希望。 首先,你显然已经编辑了一堆代码,这很好,虽然可能有其他问题,但这是从哪里来的? NSLog(@"strMortgageAmount: %@", strMortgageAmount);你的 NSString 属性是 *strReceiveValue; 这是一个错字:) NSLog(@"strReceiveValue: %@", strReceiveValue); 让我创建示例并在 Dropbox 中分享它。我是 iOS 新手,但我真的很喜欢玩它...感谢您的帮助..

以上是关于在具有内容视图和视图控制器的 tabbarcontroller 之间传递数据的主要内容,如果未能解决你的问题,请参考以下文章

在 splitViewController 的 detailView 中设置 barButtonItem 的标题

如何让 ScrollView 半透明并使其背后的内容具有交互性?

macOS Cocoa:窗口内的TabViewController,具有全尺寸内容视图

Joomla 3.0 一个具有多个视图的组件

集合视图内容未显示在视图中

如何根据文本视图内容大小设置滚动视图中的启用或禁用滚动?