我有一个视图控制器,我希望能够通过右上角解雇"完成"导航栏上的按钮。我没有使用uinavcontoller,但只是在我的viewDidLoad中添加了这样的导航栏:
bar = [[UINavigationBar alloc] init];
在.h:
IBOutlet UINavigationBar *bar;
当然,连接IB上的导航栏。
然后我尝试在viewDidLoad中添加一个导航项,但没有任何反应:
rightButton = [[UIBarButtonItem alloc] initWithTitle:@"Done" style:UIBarButtonSystemItemDone target:nil action:nil];
UINavigationItem *item = [[UINavigationItem alloc] initWithTitle:@"Title"];
item.rightBarButtonItem = rightButton;
item.hidesBackButton = YES;
[bar pushNavigationItem:item animated:NO];
请注意 - 这里有几个问题,但没有人回答这个问题。
感谢您的帮助!
答案 0 :(得分:9)
如果你已经在IB中拥有它,你将不希望在代码中分配/初始化该栏。这将创建它的第二个版本,消息可能会出现偏差。如果您将条形图放入IB中的视图中,最简单的方法是将“完成”按钮放在那里。首先,您将要使用UINavigationItem而不是UINavigationBar。将UIBarButtonItem拖到UINavigationItem的右侧,将文本从Item更改为Done,然后选择样式。然后,您将创建一个IBAction方法来执行您希望按钮执行的操作(关闭视图)。然后,只需将按钮的选择器(在IB中)连接到IBAction方法,这将完成您想要的操作。
如果您想要/需要以编程方式执行此操作,您只需使用以下内容。
rightButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(dismissView:)];
navigationItem.rightBarButtonItem = rightButton;
[rightButton release];
您也需要dismissView:
方法。
- (IBAction)dismissView:(id)sender {
// do something;
}
编辑:要以编程方式执行此操作,首先要在头文件中添加导航栏
UINavigationBar *navBar;
如果您计划允许方向更改,则只需要执行此操作。由于您没有使用IB,因此无需将其作为插座,因此我们已在标题中完成。
在实施文件中,您要调用以下内容:
- (void)viewDidLoad {
navBar = [[UINavigationBar alloc] init];
UINavigationItem *navItem = [[[UINavigationItem alloc] initWithTitle:@"some title"] autorelease];
UIBarButtonItem *done = [[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(dismissView:)] autorelease];
navItem.rightBarButtonItem = done;
navBar.items = [NSArray arrayWithObject:navItem];
[self.view addSubview:navBar];
}
- (void)viewDidAppear:(BOOL)animated {
navBar.frame = CGRectMake(0, 0, self.view.frame.size.width, 44);
}
- (void)didRotateFromInterfaceOrientation:(UIInterfaceOrientation)fromInterfaceOrientation {
navBar.frame = CGRectMake(0, 0, self.view.frame.size.width, 44);
}
- (void)dealloc {
[navBar release];
}
首先创建实例并将它们放在视图中。一旦出现视图并且程序已知帧大小,它就会调整导航栏的大小(进而调整其子视图的大小)到适当的大小。然后,只要方向改变,它就会相应地调整大小。我测试过这只是为了确保所有这些都是好的信息,它对我来说很好,所以它也应该对你有好处。希望它可以帮助你