ios - 从 ViewController 调用 nib 方法

标签 ios objective-c methods nib

请告诉我我做错了什么。我在 ViewController 中有一个 *nib 文件的实例。 ViewController 实现 UITextFieldDelegate。在委托(delegate)方法“textField shouldChangeCharactersInRange”中,我调用了用 *nib 类编写的方法。在 *nib 类中我初始化了一个 User 对象,但是在 ViewController 调用 User 对象的方法中是 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];

}

* Nib 类

#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...
}

有什么建议吗?

最佳答案

我发现您的实现中有很多错误。请让我一一更正。

-(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 的 View ,那么你需要使用它的返回值。

- (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;
    }
  1. 自定义类初始化:

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

self.usersTableView = [[UsersTableView 分配] 初始化];

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

-(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;
        }

我希望它能有所帮助,并且它会起作用。

关于ios - 从 ViewController 调用 nib 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34463390/

相关文章:

iphone - 在 iPhone 中显示超链接

ios - 如何修复此社交媒体 View 共享 (iOS)?

iOS白屏调试

python - 带下划线的方法和不带下划线的方法有什么区别,特别是 dir() 方法列出的方法?

ios - 应用商店提交错误 Invalid Bundle Structure

iOS Instagram 标签文本布局?它是如何完成的?

java - 如何知道方法是 N 还是 N^2

testing - 在所有测试用例中使用相同的代码

android - 使用移动浏览器(Unity webgl)时如何强制横向模式?

ios - 如何注册推送通知? iOS 10