请告诉我,我做错了什么。我在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...
}
有什么建议吗?
答案 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;
}
使用简单的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];