从ViewController调用nib方法

时间:2015-12-25 13:45:39

标签: ios objective-c methods nib

请告诉我,我做错了什么。我在ViewController中有一个* nib文件的实例。 ViewController实现了UITextFieldDelegate。在委托方法" 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 class

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

有什么建议吗?

3 个答案:

答案 0 :(得分: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 *数组。如果要使用笔尖中的视图,则需要使用其返回值。

- (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. 自定义类初始化:
  2. 使用简单的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;
            }
    

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

答案 1 :(得分:0)

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

尝试从故事板加载viewcontroller。

public void insertMember(String fname,String lname, String email,String password,String contact,String gender)
    {
        SQLiteDatabase db = this.getWritableDatabase();

        ContentValues values = new ContentValues();
        values.put(M_FNAME, fname);
        values.put(M_LNAME, lname);
        values.put(M_EMAIL, email);
        values.put(M_EMAIL, password);
        values.put(M_CONTACT, contact);
        values.put(M_GENDER, gender);
        long MemberId = db.insert(MEMBER, null, values);
        Cursor cursor = db.query(MEMBER, MEMBER_COLUMNS, M_ID + " = " + MemberId, null, null, null, null);
        boolean success = cursor.moveToFirst();

        if (success) {
            cursor.close();
            db.close();
        }
}

或者如果要从xib加载视图控制器

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

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

快乐编码:)

答案 2 :(得分:0)

UIStoryboard *sb = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
UIViewController *vc = [[UIViewContoller alloc]init];
vc = [sb instantiateViewControllerWithIdentifier:@"myViewController"];
[self presentViewController:vc animated:YES complited:nil];