在不使用uinavigationcontroller的情况下将"完成"按钮添加到导航栏

Tom*_*myG 1 iphone xcode objective-c uinavigationbar uinavigationcontroller

我有一个视图控制器,我希望能够通过导航栏上的右上角"完成"按钮解除.我没有使用uinavcontoller,但只是在我的viewDidLoad中添加了这样的导航栏:

  bar = [[UINavigationBar alloc] init];
Run Code Online (Sandbox Code Playgroud)

在.h:

IBOutlet UINavigationBar *bar;
Run Code Online (Sandbox Code Playgroud)

当然,连接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];
Run Code Online (Sandbox Code Playgroud)

请注意 - 这里有几个问题,但没有一个回答这个问题.

谢谢您的帮助!

jus*_*tin 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];
Run Code Online (Sandbox Code Playgroud)

你也需要一种dismissView:方法.

- (IBAction)dismissView:(id)sender {
    // do something;
}
Run Code Online (Sandbox Code Playgroud)

编辑:要以编程方式执行此操作,首先要在头文件中添加导航栏

UINavigationBar *navBar;
Run Code Online (Sandbox Code Playgroud)

如果您计划允许方向更改,则只需要执行此操作.由于你没有使用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];
}
Run Code Online (Sandbox Code Playgroud)

首先创建实例并将它们放在视图中.一旦出现视图并且程序已知帧大小,它就会调整导航栏的大小(进而调整其子视图的大小)到适当的大小.然后,只要方向改变,它就会相应地调整大小.我测试过这只是为了确保所有这些都是好的信息,它对我来说很好,所以它也应该对你有好处.希望它可以帮助你