将初始视图控制器连接到选项卡视图控制器

Posted

技术标签:

【中文标题】将初始视图控制器连接到选项卡视图控制器【英文标题】:Connect initial view controller to tab view controller 【发布时间】:2015-06-10 00:21:21 【问题描述】:

我想使用登录场景作为初始视图控制器并将其连接到选项卡视图控制器。我不断收到以下错误消息:

由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“-[UIViewController tabBar]: unrecognized selector sent to instance 0x7fe85a560fd0”

//  LogInViewController.h
#import <UIKit/UIKit.h>

@interface LogInViewController : UIViewController <UITextFieldDelegate>
@property (weak, nonatomic) IBOutlet UITextField *txtUsername;
@property (weak, nonatomic) IBOutlet UITextField *txtPassword;

- (IBAction)sigininClicked:(id)sender;

- (IBAction)backgroundTap:(id)sender;
@end


//  AppDelegate.m
// 

#import "AppDelegate.h"

@interface AppDelegate ()

@end

@implementation AppDelegate

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


// Assign tab bar item with titles
UITabBarController *tabBarController = (UITabBarController *)self.window.rootViewController;
UITabBar *tabBar = tabBarController.tabBar;
UITabBarItem *tabBarItem1 = [tabBar.items objectAtIndex:0];
UITabBarItem *tabBarItem2 = [tabBar.items objectAtIndex:1];
UITabBarItem *tabBarItem3 = [tabBar.items objectAtIndex:2];
UITabBarItem *tabBarItem4 = [tabBar.items objectAtIndex:3];

tabBarItem1.title = @"Trucks";
tabBarItem2.title = @"Dashboard";
tabBarItem3.title = @"Map";
tabBarItem4.title = @"Settings";

[tabBarItem1 setFinishedSelectedImage:[UIImage imageNamed:@"iu.png"]
          withFinishedUnselectedImage:[UIImage imageNamed:@"iu.png"]];
[tabBarItem2 setFinishedSelectedImage:[UIImage imageNamed:@"dashboard.png"]
          withFinishedUnselectedImage:[UIImage imageNamed:@"dashboard.png"]];
[tabBarItem3 setFinishedSelectedImage:[UIImage imageNamed:@"globe.png"]
          withFinishedUnselectedImage:[UIImage imageNamed:@"globe.png"]];
[tabBarItem4 setFinishedSelectedImage:[UIImage imageNamed:@"settings.png"]
          withFinishedUnselectedImage:[UIImage imageNamed:@"settings.png"]];

return YES;

【问题讨论】:

添加您的代码...没有它我们怎么能看到问题? 刚刚添加了初始视图控制器h文件。我希望我可以上传情节提要的屏幕截图以显示我的意思,但不能因为我是新的堆栈溢出成员 【参考方案1】:

我不是 ios 专家,但这是我最近在我的应用程序中以编程方式(没有情节提要)的方式。这是从我的 appdelegate 中提取的代码,但它也应该适用于您的目的。

在.h文件中:

@interface AppDelegate : UIResponder <UIApplicationDelegate, UITabBarControllerDelegate>
      @property (strong, nonatomic) UITabBarController *tabBarController;
      @property (strong, nonatomic) UIWindow *window;

在.m文件中:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
    self.window = [[UIWindow alloc]initWithFrame:[[UIScreen mainScreen]bounds]];
    self.tabBarController = [[UITabBarController alloc] init];
    FirstViewController *firstvc = [[FirstViewController alloc] init];
    SecondViewController *secondvc = [[SecondViewController alloc] init];
    tabBarController.viewControllers = @[firstvc, secondvc];
    self.window.rootViewController = tabBarController;

编辑:

在我的 FirstViewController 和 SecondViewController .m 文件中:

- (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
    self= [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];

    if(self)
         self.tabBarItem.image = [UIImage imageNamed:@"img_vc1"];
         self.tabBarItem.title = @"My 1st View";
    
    return self;

希望这会有所帮助。

【讨论】:

我上面提供的 AppDelegate m 文件使用自定义标签栏项目,因此当我使用您的代码时,它会删除所有这些。我想知道除了登录屏幕之外,刮掉标签栏控制器并为每个视图控制器构建一个自定义标签栏是否会更容易。 我也使用自定义标签栏项目。但是我将它们设置在 FirstViewController 和 SecondViewController 中的 (instancetype)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 中。我会更新我的代码来告诉你我的意思。 很高兴我能帮上忙!

以上是关于将初始视图控制器连接到选项卡视图控制器的主要内容,如果未能解决你的问题,请参考以下文章

从另一个选项卡返回后视图控制器变黑

swift 3登录后如何返回主页或以前的视图控制器

使用选项卡视图控制器演练

表视图控制器上的 ios 栏按钮项

嵌入在选项卡视图控制器中的受保护视图?

iOS - 如何将选项卡与情节提要中的特定视图控制器链接?