簡體   English   中英

將數據傳遞給Tabbar控制器

[英]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; 
}

就像以前一樣,在SecondViewControllerSecondViewController更改SecondViewController

我自己跑了; 應該很適合你的設置。

請享用。

也可以在TabBar的子視圖控制器本身中從TabBar訪問數據,如下所示:

MyTabbarViewController *tabbar = (MyTabbarViewController *)self.tabBarController;
NSLog(@"%@", tabbar.data);

這樣,您只需在TabBar中設置數據,如上所示,然后在子視圖中隨時訪問它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM