[英]Passing Data to Tabbar Controller
我有一個故事板項目,我想將一些數據從視圖傳遞到標簽欄控制器,信息將分布在選項卡之間。 在做了一些研究后,我發現了一個非常類似的問題: iOS故事板傳遞數據navigationViewController,但這個解決方案唯一的問題是它沒有轉移到標簽欄控制器。 我想知道我是否必須將數據傳遞給每個標簽,還是可以將其傳遞給標簽欄控制器然后從那里傳播? 提前謝謝你的幫助!
我目前正在使用以下內容; 但是,我收到一個錯誤:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
if ([segue.identifier isEqualToString:@"FoodPage"]) {
NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow];
UINavigationController *nav = [segue destinationViewController];
FoodViewController *destViewController = (FoodViewController*) nav.topViewController;
destViewController.Foods = [foodArray objectAtIndex:indexPath.row];
}
}
為了在您的情況下獲得對UINavigationController
的引用,您必須執行以下操作並首先為tabBarController
指定正確的索引:
UINavigationController *nav = [self.tabBarController.viewControllers objectAtIndex:<THE_INDEX_NUMBER_FOR_YOUR_NAVIGATION_CONTROLLER];
完成后,通過在UINavigationController
上再次指定它的索引號來檢索對FoodViewController
的引用(即如果它在頂部,則為0
):
FoodViewController *destViewController = (FoodViewController*) [self.nav.viewControllers objectAtIndex:0];
更新 :
現在我已經更好地了解了您想要實現的目標:
您正在使用UITabbarController
,其中嵌入了其他控制器。
場景/示例案例 :
假設我們分別有2個視圖控制器,控制器A和控制器B,它們都嵌入在UITabbarController
。
我們想要什么:
我們正在嘗試從控制器A更改控制器B中UILabel
的文本。
首先 ,在.h中聲明控制器B中的property
:
@property(strong, nonatomic) UILabel *aLabelInControllerB;
其次 ,在你的控制器A中聲明一個屬性(或ivar):
@property(strong, nonatomic) ControllerB *controllerB;
由於您使用的是UITabbarController
您無需使用segue,只需通過self.tabBarController
獲取UITabbarController
;
問題 :“當我的標簽欄控制器被點擊然后更改控制器B中標簽的文本時,我怎么知道?”
我們這樣做:
通過以下方式將控制器A設置為UITabbarController
的委托:
在控制器A .h中,添加:
@interface <Your_Controller> : UIViewController <UITabBarControllerDelegate>
在控制器A的viewDidLoad
中:
self.tabBarController.delegate = self;
在控制器A .m中,實現此方法:
- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController
{
self.controllerB = (ControllerB *) [tabBarController.viewControllers objectAtIndex:1];
//In our example here, we only have 2 view controllers (A and B)
//So, index 1 is where controller B resides.
self.controllerB.aLabelInControllerB.text = @"Hello!";
//This will change the text of the label in controller B
}
當控制器B出現時,您將看到標簽的文本將更改為“Hello!”
在控制器B中設置NSString
遵循相同的過程。
例如: self.controllerB.stringInControllerB = @"Hi from controller B!";
希望有所幫助。
更新2:
從表格視圖單元格到標簽欄控制器? Oki ..這是解決方案。 我在我的例子中只使用了一個單元格,所以如果你希望將來有更多的單元格,我會把它留給你來調整。
我們來看看故事板布局:
在故事板中, 控制從單元格拖動到選項卡欄控制器。
添加如圖所示的UINavigationController
。
在你的UITableViewController
.m中:
添加2個屬性:
@property (strong, nonatomic) UITabBarController *myTabbarController;
@property (strong, nonatomic) YourFirstViewController *myFirstViewController;
只是一個善意的提醒:
記得添加:
self.tableView.delegate = self;
self.tableView.dataSource = self;
在表視圖控制器中添加以下內容:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
self.myTabbarController = (UITabBarController*) [segue destinationViewController];
self.myFirstViewController = [self.myTabbarController.viewControllers objectAtIndex:0];
self.myFirstViewController.stringFromTableViewController = @"Hi from TableViewController!";
}
在myFirstViewController
,在.h中添加2個屬性:
@property (strong, nonatomic) NSString *stringFromTableViewController;
@property (strong, nonatomic) YourSecondViewController *secondViewController;
與上面的第二個編輯一樣,讓您的第一個視圖控制器仍然是UITabBarControllerDelegate的委托並實現此方法:
- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController
{
self.secondViewController = (YourSecondViewController*) viewController;
self.secondViewController.aLabel.text = self.stringFromTableViewController;
}
就像以前一樣,在SecondViewController
中SecondViewController
更改SecondViewController
。
我自己跑了; 應該很適合你的設置。
請享用。
也可以在TabBar的子視圖控制器本身中從TabBar訪問數據,如下所示:
MyTabbarViewController *tabbar = (MyTabbarViewController *)self.tabBarController;
NSLog(@"%@", tabbar.data);
這樣,您只需在TabBar中設置數據,如上所示,然后在子視圖中隨時訪問它。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.