如何使用用Interface Builder创建的nib文件加载UIView

我试图做一些细致的事情,但应该是可能的。 所以这里对你所有的专家来说都是一个挑战(这个论坛是你们中许多人的一部分:))。

我创建了一个调查问卷“组件”,我想在NavigationContoller (我的QuestionManagerViewController )上加载它。 “组件”是一个“空的” UIViewController ,它可以根据需要回答的问题加载不同的视图。

我这样做的方式是:

  • 创建Question1View对象作为UIView子类,定义一些IBOutlets
  • 创建(使用Interface Builder) Question1View.xib (这里是我的问题可能是 )。 我将UIViewControllerUIView都设置为Question1View类。
  • 我将插座与视图的组件(使用IB)相链接。
  • 我重写了我的QuestionManagerViewControllerinitWithNib ,如下所示:

    - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil {
        if (self = [super initWithNibName:@"Question1View" bundle:nibBundleOrNil]) {
            // Custom initialization
        }
        return self;
    }
    
  • 当我运行代码时,出现此错误:

    2009-05-14 15:05:37.152 iMobiDines [17148:20b] ***由于未捕获的异常' NSInternalInconsistencyException ',原因:' -[UIViewController _loadViewFromNibNamed:bundle:]加载了“Question1View”笔尖,但视图插座没有设置。“

    我确定有一种方法可以使用nib文件加载视图,而无需创建viewController类。


    还有一种更简单的方法来访问视图,而不是将nib作为数组处理。

    1 )创建一个自定义的View子类,其中包含您希望稍后访问的任何插座。 - 我的看法

    2 )在您想要加载和处理笔尖的UIViewController中,创建一个IBOutlet属性,以保存加载的笔尖视图

    在MyViewController(一个UIViewController子类)

      @property (nonatomic, retain) IBOutlet UIView *myViewFromNib;
    

    (不要忘记综合它并将其释放到.m文件中)

    3)在IB中打开你的笔尖(我们称之为'myViewNib.xib'),将你的文件的所有者设置为MyViewController

    4)现在将文件的Owner出口myViewFromNib连接到笔尖中的主视图。

    5)现在在MyViewController中,写下面一行:

    [[NSBundle mainBundle] loadNibNamed:@"myViewNib" owner:self options:nil];
    

    现在只要你这样做,调用你的财产“self.myViewFromNib”将让你访问你的笔尖视图!


    谢谢你们。 我确实找到了一种做我想做的事情的方式。

  • 用你需要的IBOutlet创建你的UIView
  • 在IB中创建xib,按照喜欢的方式设计它,并像下面这样链接它:文件的所有者是类UIViewController (没有自定义子类,但是是“真正的”子类)。 文件所有者的视图连接到主视图,并将其类声明为步骤1)中的一个。
  • 将您的控件与IBOutlet连接起来。
  • DynamicViewController可以运行其逻辑来决定要加载的视图/ xib。 一旦它做出决定,在loadView方法中就像这样:

    NSArray* nibViews = [[NSBundle mainBundle] loadNibNamed:@"QPickOneView"
                                                      owner:self
                                                    options:nil];
    
    QPickOneView* myView = [ nibViews objectAtIndex: 1];
    
    myView.question = question;
    
  • 而已!

    主包的loadNibNamed方法将负责初始化视图并创建连接。

    现在ViewController可以根据内存中的数据显示一个视图或另一个视图,并且“父”屏幕不需要打扰这个逻辑。


    我不确定其中一些答案是在说什么,但是我需要在这里回答这个问题,以便我下次在Google中进行搜索。 关键字:“如何从nib加载UIView”或“如何从NSBundle加载UIView”。

    从Apress Beginning iPhone 3手册(第247页,“使用新的表格视图单元格”),几乎100%的代码如下:

    - (void)viewDidLoad {
        [super viewDidLoad];
        NSArray *bundle = [[NSBundle mainBundle] loadNibNamed:@"Blah"
                                                     owner:self options:nil];
        Blah *blah;
        for (id object in bundle) {
            if ([object isKindOfClass:[Blah class]]) {
                blah = (Blah *)object;
                break;
            }
        }   
        assert(blah != nil && "blah can't be nil");
        [self.view addSubview: blah];
    } 
    

    这假设你有一个UIView叫子Blah ,一个叫笔尖Blah其中包含UIView有其阶级设置为Blah


    分类:NSObject + LoadFromNib

    #import "NSObject+LoadFromNib.h"
    
    @implementation NSObject (LoadFromNib)
    
    + (id)loadFromNib:(NSString *)name classToLoad:(Class)classToLoad {
        NSArray *bundle = [[NSBundle mainBundle] loadNibNamed:name owner:self options:nil];
        for (id object in bundle) {
            if ([object isKindOfClass:classToLoad]) {
                return object;
            }
        }
        return nil;
    }
    
    @end
    

    Swift Extension

    extension UIView {
        class func loadFromNib<T>(withName nibName: String) -> T? {
            let nib  = UINib.init(nibName: nibName, bundle: nil)
            let nibObjects = nib.instantiate(withOwner: nil, options: nil)
            for object in nibObjects {
                if let result = object as? T {
                    return result
                }
            }
            return nil
        }
    }
    

    并使用一个例子:

    class SomeView: UIView {
        class func loadFromNib() -> SomeView? {
            return self.loadFromNib(withName: "SomeView")
        }
    }
    
    链接地址: http://www.djcxy.com/p/78229.html

    上一篇: How to load a UIView using a nib file created with Interface Builder

    下一篇: How do you load custom UITableViewCells from Xib files?