我有一个主表视图。和一个DetailView。单击单元格时,将显示该单元格的DetailView,其中显示该单元格的详细信息。 DetailView下一个和前一个有两个按钮。我想知道如何禁用RootViewcontroller.m中的详细视图按钮。代码如下所示:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
DetailViewController *nextController = [[DetailViewController alloc] init];
int storyIndex = [indexPath indexAtPosition:[indexPath length] -1];
nextController = [nextController initWithObjectAtIndex:storyIndex inArray:stories];
NSString *storyTitle = [[stories objectAtIndex:storyIndex] objectForKey:@"title"];
nextController.title = @"Details";
UIBarButtonItem *tempButtonItem = [[[UIBarButtonItem alloc] init] autorelease];
tempButtonItem.title = @"Back";
self.navigationItem.backBarButtonItem = tempButtonItem ;
nextController.sTitle = storyTitle;
[self.navigationController pushViewController:nextController animated:YES];
[nextController release];
}
我已在此行之后尝试了nextController.next.enabled = NO和[nextController.next setEnabled:NO]: [self.navigationController pushViewController:nextController animated:YES];
其中next是DetailViewController中的UIBarButtonItem名称。 任何人都可以告诉我如何禁用该按钮。 提前谢谢
答案 0 :(得分:1)
不会同时加载Viewcontrollers和视图。这意味着当你在你的情况下实例化DetailViewController的对象时,不会绘制视图(如果你正在使用Nib),这是延迟加载概念的一部分。
因此,第一次发送消息setEnabled = NO时,对象将为nil(在Objective C中允许向nil对象发送消息)。
示例:
[nextController setEnabled:NO]
等于[nil setEnabled:NO]
,这肯定不是您想要的。
下一次,除非内存警告和视图被卸载,否则视图将在内存中,对按钮的引用将不再为零,因此第二次调用它时,它将起作用。
并在pushViewController:animate
如果要初始化要禁用的按钮,可以将此代码放在viewDidLoad / viewWillAppear中,具体取决于应用程序的上下文。
这只是一种可能的解决方案。
在评论中编辑回复请求:
在DetailviewController的初始化方法中添加:
self.navigationItem.leftBarButtonItem = [[[UIBarButtonItem alloc] initWithTitle:@"Back" style:UIBarButtonItemStyleBordered target:self action:@selector(backToRoot)] autorelease];
- (void)backToRoot {
[self.navigationController popToRootViewControllerAnimated:YES];
}
并将方法签名添加到头文件中。
对UINavigationController的引用:http://developer.apple.com/library/ios/#documentation/uikit/reference/UINavigationController_Class/Reference/Reference.html