【问题标题】:Created TabbarController in Storyboard can't change view programmatically在 Storyboard 中创建的 TabbarController 无法以编程方式更改视图
【发布时间】:2013-03-15 19:20:49
【问题描述】:

创建了一个tabbarcontroller 作为拆分视图控制器的详细视图。我可以通过单击模拟器上的item1item2 图标来更改视图,但不能以编程方式更改视图。

当我尝试在 nslog 中打印 viewcontrollers 时,我得到了 null。 在 MasterView 中:

@property (strong, nonatomic) TabBarRootViewController *detailViewController;
- (void)viewDidLoad
{
    [super viewDidLoad];
    self.detailViewController=[[TabBarRootViewController alloc] init];
//tried also
self.detailViewController = (TabBarRootViewController *)[self.splitViewController.viewControllers objectAtIndex:1];

}
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    //this sends object info to detail
    if (indexPath.section==0) {
        //send row number
       NSNumber *i = [NSNumber numberWithInteger:indexPath.row];
        NSLog(@"Selected index %@",i);

        self.detailViewController.detailItem = i;
    }
}

详细(标签栏):

@property (strong, nonatomic) id detailItem;

if (self.detailItem) {
    NSInteger i=[self.detailItem integerValue];
    NSLog(@"recieved integer is %i",i);

    //tried this
    self.tabBarController.selectedIndex=i;
    self.tabBarController.selectedViewController = [self.tabBarController.viewControllers objectAtIndex:i];

    //list of viewcontrollers
    NSArray *array;
    array = [[self tabBarController] viewControllers];
    NSLog(@"array %@",array);

}

NSLOG:
recieved integer is 1
array (null)

如何以编程方式更改视图?

谢谢,

S

【问题讨论】:

  • 为什么导航控制器中有标签栏控制器?以上代码在哪个控制器中?
  • @rdelmar 没有导航控制器我得到 [TabbarRootViewController topViewController]: unrecognized selector sent to instance 错误。代码在TabbarRootViewController
  • 那就不要调用topViewController了!我认为您没有理由在那里拥有导航控制器。你在推动什么吗?如果没有,请摆脱它。 moreNavigationController 到底是什么?只有当您有超过 5 个标签时才会出现这种情况。
  • @rdelmar ok 删除了 navigation controllertopviewcontroller 请求,但仍然在 nslog 中收到 null。 In masterview viewdidload I call self.detailViewController=[[TabBarRootViewController alloc] init]; and when a row selected I want to change the tabbar item to selected row index.更新了我在 masterview 中调用 tabbardetail 项的位置添加的问题
  • 我无法阅读您发布的图片上的控制器名称,因此很难分辨您在说什么控制器。但是,如果 TabBarRootViewController 是情节提要中的控制器之一,则不应分配它。据我所知,这是拆分视图控制器的详细视图控制器,因此可以使用 self.splitViewController.viewControllers[1] 来引用它(索引 0 处的那个是主控制器)。您确实需要阅读 UIViewController 类参考顶部链接的 2 个文档,以了解您应该做什么。

标签: ios objective-c ipad uitabbarcontroller


【解决方案1】:

看起来您的标签栏控制器是nil。可能没有正确链接到情节提要?

【讨论】:

  • 不,我可以选择(TabBarRootViewController *)[self.splitViewController.viewControllers objectAtIndex:1];,我已经检查了故事板上的班级名称是正确的。
【解决方案2】:

您需要在当前控制器上使用performSegueWithIdentifier:sender:

这是因为您的控制器现在由情节提要控制,它必须保持状态等。

请注意,您需要在情节提要编辑器中为您的 segues 提供一个 ID,并且您不能使用自己的 init,而是必须覆盖 prepareForSegue:sender: 以注入属性。

祝你好运。

【讨论】:

  • 其实你可以根据需要覆盖initWithCoder
  • 是的,但这会促进耦合
  • 我不这么认为。视图控制器及其在 xib 或故事板文件中的对应对象已经耦合
  • 我试图暗示这个方法提供了一个注入点。此外,在使用情节提要时,它是苹果首选的导航方式。
【解决方案3】:

问题是无法获得指向 Tabbar 控制器的确切指针。

我删除了导航控制器,只留下了标签栏控制器。还删除了主视图和 appdelegate 中的 [topcontroller] 请求。

所以最终的工作代码是

应用代理:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // Override point for customization after application launch.
    return YES;
}

主视图: - (void)viewDidLoad

{
    [super viewDidLoad];

    self.detailViewController = (TabBarRootViewController *)[self.splitViewController.viewControllers objectAtIndex:1];

}

在tabbarcontroller(细节控制器)中

@property (strong,nonatomic) UITabBarController *rootController;

        self.rootController= (TabBarRootViewController *)[self.splitViewController.viewControllers objectAtIndex:1];
        self.rootController.selectedIndex=i;

【讨论】:

  • 所以我是对的 - 它零。您应该留下您的答案以供参考,但将正确答案奖励给我。
猜你喜欢
  • 1970-01-01
  • 2011-11-17
  • 2014-05-04
  • 2014-03-16
  • 2014-03-12
  • 2012-11-24
  • 1970-01-01
  • 1970-01-01
  • 2012-02-03
相关资源
最近更新 更多