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
。在masterviewviewdidload
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;