从 ViewController 调用 nib 方法

Posted

技术标签:

【中文标题】从 ViewController 调用 nib 方法【英文标题】:Call nib method from ViewController 【发布时间】:2015-12-25 13:45:38 【问题描述】:

请告诉我我做错了什么。我在 ViewController 中有一个 *nib 文件的实例。 ViewController 实现 UITextFieldDelegate。在委托方法“textField shouldChangeCharactersInRange”中,我调用了 *nib 类中编写的方法。在 *nib 类中,我初始化了一个用户对象,但在 ViewController 调用的方法中,用户对象是 nil...

这里是代码..

@implementation ViewController
- (void)viewDidLoad 
    [super viewDidLoad];
    self.usersTableView = [[UsersTableView alloc] init];

// Call delegate method
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string 

[self.usersTableView searchTextFieldDidChange:searchString];


*笔尖类

#import "User.h"    

@interface UsersTableView()
@property (nonatomic) User *user;
@end


- (instancetype)initWithCoder:(NSCoder *)aDecoder 

    self = [super initWithCoder:aDecoder];
    if (self) 

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

    [self addSubview:self.view];
    self.user = [[User alloc] init];
  
     return self;


.....Anyware [self testMethod];

- (void)testMethod 
    NSLog (@"%@", self.user) // user object exist


// Method called from ViewController

- (void)searchTextFieldDidChange:(NSString *)searchText 

    NSLog (@"%@", self.user) // user object is nil...

有什么建议吗?

【问题讨论】:

您是否附加了故事板的委托? 检查文件所有者和文本字段的委托 嘿,你是否在 textField 中显示了文本字符串 shouldChangeCharactersInRange.. 并且请输入 return yes bcs 那是非 void 方法。 【参考方案1】:

我在您的实施中发现了许多错误。请让我一一更正。

-(instancetype)initWithCoder:(NSCoder *)aDecoder        
           self = [super initWithCoder:aDecoder];
           if (self) 

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

           [self addSubview:self.view];
           self.user = [[User alloc] init];
         
            return self;    

loadNibNamed: 方法将返回一个 UIView* 数组。如果要使用 nib 中的视图,则需要使用它的返回值。

- (instancetype)initWithCoder:(NSCoder *)aDecoder 

        self = [super initWithCoder:aDecoder];
        if (self) 

        NSArray* viewArray = [[NSBundle mainBundle] loadNibNamed:@"UsersTableView" owner:self options:nil];

        [self addSubview:[viewArray firstObject]];
        self.user = [[User alloc] init];
      
         return self;
    
    自定义类初始化:

您使用简单的 alloc init 创建 tableView,它不调用 initWithCoder 方法。

self.usersTableView = [[UsersTableView alloc] init];

我认为你应该实现- (instancetype)init 方法,并将自定义视图初始化放在那里。

-(instancetype)init        
            self = [super init];
            if (self) 

            NSArray* viewArray = [[NSBundle mainBundle] loadNibNamed:@"UsersTableView" owner:self options:nil];

            [self addSubview:[viewArray firstObject]];
            self.user = [[User alloc] init];
          
             return self;
        

我希望它会有所帮助,并且会奏效。

【讨论】:

我将外部 *nib 加载到 Storyboard 的 ViewController 中的 UIView 中。你告诉我的方法 - NSArray* viewArray = [[NSBundle mainBundle] loadNibNamed:@"UsersTableView" owner:self options:nil]; [self addSubview:[viewArray firstObject]]; 不要在 UIView 中显示表格视图。我有一个到 *nib 类中的 tableView 的 IBOutlet 连接,并且这个引用在 nil ... 您能检查一下数组中的第一个视图是什么吗?如果它是所需的 tableView,则检查它的框架。我认为它的框架是无效的。尝试 UIView* firstView = [viewArray firstObject]; firstView.frame = self.bounds; [self addSubview:firstView]; viewArray的第一个对象是UIView。 UIView:0x7b63b2e0;帧 = (0 0; 320 447);自动调整大小 = W+H;层 = - (instancetype)initWithCoder:(NSCoder *)aDecoder 方法中,所有视图对象(UITableView 和UserTableView 实例)都初始化正确。问题是当我从 UIViewController 调用用 UsersTableView.m 编写的方法时,所有对象都是 nil ......无论如何,谢谢你的帮助!如果你想看项目,这里是github的链接->github.com/makedonskii/Keyboard.git 我检查了代码,我发现了问题,您想在这里描述问题,或者我可以向一些 cmets 提出拉取请求吗?【参考方案2】:

initWithCoder 仅在您从故事板实例化视图控制器时被调用。不幸的是,在您的情况下,用户对象正在 initWithCoder 中初始化,而您正在使用 init 创建 viewcontroller 的实例。

尝试从故事板加载视图控制器。

 UIStoryboard *sb = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
UIViewController *vc = [sb instantiateViewControllerWithIdentifier:@"myViewController"];

或者如果你想从 xib 加载视图控制器使用

NSArray *subviewArray = [[NSBundle mainBundle] loadNibNamed:@"Your_nib_name" owner:self options:nil];
UIView *mainView = [subviewArray objectAtIndex:0];

如果您仍然不满意,请覆盖您的 nib 类的 init 并在 init 方法中实例化用户对象,尽管我不喜欢这样做:)

编码愉快:)

【讨论】:

【参考方案3】:
UIStoryboard *sb = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
UIViewController *vc = [[UIViewContoller alloc]init];
vc = [sb instantiateViewControllerWithIdentifier:@"myViewController"];
[self presentViewController:vc animated:YES complited:nil];

【讨论】:

请描述如何解决上述问题。

以上是关于从 ViewController 调用 nib 方法的主要内容,如果未能解决你的问题,请参考以下文章

从 UIButton 向 ViewController 发送通知

从 NIB 错误加载 ViewController [重复]

如何从 ViewController 中的 xib (nib) 实例化 UIView / UITableView

如何在 ViewController 中多次使用自定义 nib 视图

View加载过程

将另一个 nib 加载到 viewController