Ios 在故事板can';不要以编程方式更改视图

Ios 在故事板can';不要以编程方式更改视图,ios,objective-c,ipad,uitabbarcontroller,Ios,Objective C,Ipad,Uitabbarcontroller,创建了一个tabbarcontroller,作为splitview控制器的详细视图。我可以通过单击模拟器上的item1,item2图标来更改视图,但不能以编程方式更改视图 尝试在nslog中打印viewcontrollers时,我得到null。 在MasterView中: @property (strong, nonatomic) TabBarRootViewController *detailViewController; - (void)viewDidLoad { [super vi

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

尝试在
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;
    }
}
详细信息(选项卡栏):

如何以编程方式更改视图

谢谢


S

看起来您的选项卡栏控制器是
nil
。可能与情节提要链接不正确?

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

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

请注意,您需要在序列图像板编辑器中为您的序列提供一个ID,并且您不能使用自己的init,相反,您必须重写
prepareforsgue:sender:
,以插入属性


祝你好运。

问题是无法获得指向阿巴斯控制器的准确指针

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

所以最后的工作代码是

appdelegate:

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

{
    [super viewDidLoad];

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

}
在tabbarcontroller(详图控制器)中


为什么导航控制器中有选项卡栏控制器?上面的代码在哪个控制器中?@rdelmar不带导航控制器我得到
[TabbarRootViewController topViewController]:发送到实例的无法识别的选择器
错误。代码在TabbarRootViewController中,不要调用topViewController!我看你没有理由在那里安装导航控制器。你有什么想法吗?如果没有,就把它扔掉。moreNavigationController到底是怎么回事?只有当您有5个以上的选项卡时,才会出现这种情况。@rdelmar ok删除了
导航控制器
topviewcontroller
请求,但在nslog中仍然得到
null
。在masterview
viewdidload
I调用
self.detailViewController=[[TabBarRootViewController alloc]init]当选择一行时,我想将选项卡项更改为选定行索引。更新了在MasterView中添加的问题,即我在何处调用TabbardDetail项我无法读取您发布的图像上的控制器名称,因此很难说出您所谈论的控制器。但是,如果TabBarRootViewController是故事板中的一个控制器,则不应允许它初始化。据我所见,这是拆分视图控制器的详细视图控制器,因此可以使用self.splitViewController.viewControllers[1]引用它(索引0处的控制器将是主控制器)。你真的需要阅读UIViewController类引用顶部链接的2个文档来理解你应该做什么。不,我可以选择
(TabBarRootViewController*)[self.splitViewController.viewControllers objectAtIndex:1]我已经检查了情节提要上的类名,这是正确的。事实上,如果需要,您可以用coder重写
initWithCoder
。是的,但这会促进耦合,我认为不会。在xib或故事板文件中,视图控制器及其相应的对象已经耦合在一起了。我试图暗示这样一个事实,即该方法提供了一个注入的入口点。此外,苹果在使用故事板时更喜欢这种导航方式,所以我是对的,它是零。你应该留下你的答案作为参考,但把正确的答案给我。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // Override point for customization after application launch.
    return YES;
}
{
    [super viewDidLoad];

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

}
@property (strong,nonatomic) UITabBarController *rootController;

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