代码之家  ›  专栏  ›  技术社区  ›  Atma

在带按钮的ui视图和非ui导航控制器之间切换

  •  3
  • Atma  · 技术社区  · 16 年前

    我看到了这个职位 How to switch views by buttons on iPhone? 但这并不能回答如何通过按钮在视图之间来回切换。提出问题的人确定了他们可以使用uinavigationcontroller在视图之间切换的答案。

    我把下面的代码放在一个IBaction中,当在主视图中按下一个按钮时,这个IBaction就会启动。

             PhoneNumberViewController *phoneNumberViewController1 = [[PhoneNumberViewController alloc] initWithNibName:@"PhoneNumberView2" bundle:nil];
    self.phoneNumberViewController = phoneNumberViewController1;
    [self.view removeFromSuperview];
    [self.view insertSubview: phoneNumberViewController1.view atIndex:0];
    

    当这段代码执行时,整个视图变为空白。如果我省略了从超级视图删除部分,那么视图将消失在我的按钮后面,但按钮仍然保留。我不确定这是否是在按钮之间切换的正确方法,但如果有人知道如何切换,请提供帮助。另外,如果有人知道任何在视图和按钮之间切换的示例项目,请告诉我。

    非常感谢!

    2 回复  |  直到 11 年前
        1
  •  2
  •   Martin Gordon    16 年前

    您从超级视图中删除了视图控制器的视图,然后向其添加了一个子视图。视图层次结构在视图控制器的超级视图(可能是您的窗口)中被破坏。这就是为什么你会得到一个空白屏幕。

    您可能希望保留对原始视图的引用,然后通过将视图控制器的视图设置为新视图将其交换到新视图。

    // origView is an instance variable/IBOutlet to your original view.
    - (IBAction)switchToPhoneView:(id)sender {
      if (origView == nil)
        origView = self.view;
      self.view = phoneViewController.view;
    }
    
    - (IBAction)switchToOriginalView:(id)sender {
      self.view = origView;
    }
    
        2
  •  1
  •   Willy    11 年前

    我通常使用的技术包括创建一个超级视图类,该类在底部包含一个工具栏,以及一个内容视图uiview类填充屏幕的其余部分。

    然后,我将子视图添加到内容视图,以根据按钮单击更改视图。这种方法使得工具栏在所有视图中保持不变。我首先定义一个这样的助手函数:

    -(void) clearContentView {
        //helper to clear content view
        for (UIView *view in [self.contentView subviews]){
            [view removeFromSuperview];
        }
    }
    

    我的操作如下:

    -(IBAction) buttonClicked{
        self.title = @"Images"; //change title of view
        [self clearContentView]; //clear content view
        [self.contentView addSubview:self.imagesViewController.view]; //add new view
        [self.imagesViewController viewWillAppear:YES]; //make sure new view is updated
        [self enableButtons];  //enable all other buttons on toolbar
        self.imagesButton.enabled = NO;  //disable currently selected button
    }