【问题标题】:How to load .xib UIviews on ViewController in ios如何在 iOS 中的 ViewController 上加载 .xib UIviews
【发布时间】:2016-02-15 08:57:17
【问题描述】:

您好,我是 ios 新手,在我的应用中,我正在使用 .xib 文件加载 UIView

当我单击第一个按钮时,我想加载 FirstView 并删除其他视图 当我单击第二个按钮时,我想加载 SecondView 并删除其他视图 当我单击第三个按钮时,我想加载 ThirdView 并删除 otherviews

我的代码:-

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController
@synthesize leftView,rightView;

- (void)viewDidLoad {
    [super viewDidLoad];
}

- (IBAction)FirstAction:(id)sender {

    FirstView * test1 = [[FirstView alloc]initWithFrame:CGRectMake(0, 0, rightView.frame.size.width, rightView.frame.size.height)];
    test1.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
    [rightView addSubview:test1];
}

- (IBAction)SecondAction:(id)sender {

    SecondView * test2 = [[SecondView alloc]initWithFrame:CGRectMake(0, 0, rightView.frame.size.width, rightView.frame.size.height)];
    test2.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
    [rightView addSubview:test2];
}

- (IBAction)ThirdAction:(id)sender {

    ThirdView * test3 = [[ThirdView alloc]initWithFrame:CGRectMake(0, 0, rightView.frame.size.width, rightView.frame.size.height)];
    test3.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
    [rightView addSubview:test3];
}

@end

【问题讨论】:

  • 试试我提供的解决方案
  • 您说您正在使用 xib 文件加载视图。但是您正在您的操作方法中以编程方式创建它们。你的项目中有 xib 文件吗?
  • 是的,我的项目中有 xib 文件,这是我的示例应用程序

标签: ios objective-c xib


【解决方案1】:

试试这段代码:我已经为视图编写了代码,它将在添加新视图之前删除以前的视图。

#import "ViewController.h"

@interface ViewController ()
{
    FirstView * test1;
    SecondView * test2;
    ThirdView * test3;
}

@end

@implementation ViewController
@synthesize leftView,rightView;

- (void)viewDidLoad {
    [super viewDidLoad];


    test1 = [[[NSBundle mainBundle] loadNibNamed:@"FirstView" owner:self options:nil] objectAtIndex:0];
    test2 = [[[NSBundle mainBundle] loadNibNamed:@"SecondView" owner:self options:nil] objectAtIndex:0];
    test3 = [[[NSBundle mainBundle] loadNibNamed:@"ThirdView" owner:self options:nil] objectAtIndex:0];

}

- (IBAction)FirstAction:(id)sender {

   test1.frame = CGRectMake(0, 0, rightView.frame.size.width, rightView.frame.size.height);
    test1.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
    [self removePreviousView:test1 FromSuperView:rightView];
    [rightView addSubview:test1];
}

- (IBAction)SecondAction:(id)sender {

    test2.frame = CGRectMake(0, 0, rightView.frame.size.width, rightView.frame.size.height);
    test2.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
    [self removePreviousView:test2 FromSuperView:rightView];
    [rightView addSubview:test2];
}

- (IBAction)ThirdAction:(id)sender {

    test3.frame = CGRectMake(0, 0, rightView.frame.size.width, rightView.frame.size.height);
    test3.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
    [self removePreviousView:test3 FromSuperView:rightView];
    [rightView addSubview:test3];
}


- (void)removePreviousView:(UIView*)previousView FromSuperView:(UIView*)view{
    for (UIView *subView in view.subviews) {
        if (![subView isKindOfClass:[previousView class]]) {
            [subView removeFromSuperview];
        }
    }
}
@end

【讨论】:

  • 如果有错误请修改好吗兄弟?
  • 你检查了吗?兄弟
  • 是的,我已经检查过您以错误的方式做几件事。就像您在 nib 中设置了视图的类,但您没有从 nib 加载视图。
  • 如果你修改了,你能把那个示例项目发给我吗?
  • 我已经更新了代码。将其替换为 UIViewController 中的代码并查看结果。
【解决方案2】:

1) 使视图全局化

FirstView * test1;
SecondView * test2;
ThirdView * test3;

随时从超级视图中删除:

[test1 removeFromSuperView];

2)添加标签查看

test1.tag = 10;

使用标签值移除视图:

[(UIView*)[rightView  viewWithTag:10] removeFromSuperview];

【讨论】:

  • 抱歉sn-p中的任何类型。
  • 嗨 @KDeogharkar 没有添加 xib UIview
  • 所以你是说视图没有显示?
  • 第一、二、三视图有xib?
【解决方案3】:

使用此代码。它包含一个 loadXib: 调用,该调用从具有给定名称的 nib 加载视图并返回它。

@interface ViewController ()
{
    FirstView * test1;
    SecondView * test2;
    ThirdView * test3;
}

@end

@implementation ViewController
@synthesize leftView,rightView;

- (void)viewDidLoad {
    [super viewDidLoad];
}

-(UIView*)loadXib:(NSString *)name
{
    UINib *nib = [UINib nibWithNibName:name bundle:nil];
    if (nib != nil)
    {
        NSArray *items = [nib instantiateWithOwner:self options:nil];
        if (items != nil && items.count == 1)
        {
            return (UIView*)items[0];
        }
    }
    return nil;
}

- (IBAction)FirstAction:(id)sender {

//   test1 = [[FirstView alloc]initWithFrame:CGRectMake(0, 0, rightView.frame.size.width, rightView.frame.size.height)];
    test1 = (FirstView*)[self loadXib:@"FirstView"];
    if (test1 != nil) {
        test1.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
        [rightView.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)];
        [rightView addSubview:test1];
    }
}

- (IBAction)SecondAction:(id)sender {

//    test2 = [[SecondView alloc]initWithFrame:CGRectMake(0, 0, rightView.frame.size.width, rightView.frame.size.height)];
    test2 = (SecondView*)[self loadXib:@"SecondView"];
    if (test2 != nil) {
        test2.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
[rightView.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)];
            [rightView addSubview:test2];
        }
    }

- (IBAction)ThirdAction:(id)sender {

//    test3 = [[ThirdView alloc]initWithFrame:CGRectMake(0, 0, rightView.frame.size.width, rightView.frame.size.height)];
    test3 = (ThirdView*)[self loadXib:@"ThirdView"];
    if (test3 != nil ) {
        test3.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;
[rightView.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)];
            [rightView addSubview:test3];
        }
    }

    @end

【讨论】:

    【解决方案4】:

    以下是您需要的方法。

    /* 不带标签 */

    - (void)removeSubviewsExpectView:(id)viewClass {
    
        for (UIView *subView in self.view.subviews) {
    
             if (![subView isKindOfClass:[viewClass class]]) {
    
                    [subView removeFromSuperview];
    
            }
        }
    
    }
    

    /* 带标签 */

    - (void)removeSubviewsExpectView:(int)viewTag {
    
        for (UIView *subView in self.view.subviews) {
    
            if (subView.tag != viewTag) {
    
                [subView removeFromSuperview];
    
            }
        }
    
    }
    

    希望对你有所帮助。

    【讨论】:

      【解决方案5】:

      首先你在NSBundle中创建UiViewIBOutlets然后你选择这个方法

      - (IBAction)FirstAction:(id)sender {
          NSArray *viewsToRemove = [rightView subviews];
          for (UIView *v in viewsToRemove) {
           [v removeFromSuperview];
           }
        UIView *firstViewUIView = [[[NSBundle mainBundle]   loadNibNamed:@"Test1" owner:self options:nil] firstObject];
         [rightView containerView addSubview:firstViewUIView];
      }
      
      - (IBAction)SecondAction:(id)sender {
      
             NSArray *viewsToRemove = [rightView subviews];
             for (UIView *v in viewsToRemove) {
               [v removeFromSuperview];
            }
             UIView *secondView = [[[NSBundle mainBundle]   loadNibNamed:@"Test2" owner:self options:nil] firstObject];
            [rightView containerView addSubview:seconView];  
      }
      
      - (IBAction)ThirdAction:(id)sender {
      
               NSArray *viewsToRemove = [rightView subviews];
               for (UIView *v in viewsToRemove) {
                [v removeFromSuperview];
                         }
                  UIView *thirdView = [[[NSBundle mainBundle]   loadNibNamed:@"Test3" owner:self options:nil] firstObject];
                 [rightView containerView addSubview:thirdView];
      
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-09-17
        • 2021-04-11
        • 2013-09-30
        • 2023-04-06
        • 2016-08-31
        • 2014-02-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多